@idealyst/mcp-server 1.2.101 → 1.2.103
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.
- package/dist/{chunk-SRNAGZJL.js → chunk-74TE7CY7.js} +7740 -2803
- package/dist/chunk-74TE7CY7.js.map +1 -0
- package/dist/index.cjs +7634 -2586
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +176 -41
- package/dist/index.js.map +1 -1
- package/dist/tools/index.cjs +7763 -2802
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.cts +99 -7
- package/dist/tools/index.d.ts +99 -7
- package/dist/tools/index.js +49 -1
- package/examples/components/Image.examples.tsx +161 -0
- package/examples/components/Text.examples.tsx +9 -10
- package/package.json +13 -6
- package/dist/chunk-SRNAGZJL.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/index.ts","../src/data/framework-guides.ts","../src/data/navigation-guides.ts","../src/data/translate-guides.ts","../src/data/storage-guides.ts","../src/data/icon-guide.ts","../src/data/packages.ts","../src/data/recipes.ts","../src/tools/definitions.ts","../src/data/component-metadata.ts","../src/data/cli-commands.ts","../src/data/install-guides.ts","../src/data/icons.json","../src/tools/get-types.ts","../src/tools/handlers.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { frameworkGuides } from \"./data/framework-guides.js\";\nimport { navigationGuides } from \"./data/navigation-guides.js\";\nimport { translateGuides } from \"./data/translate-guides.js\";\nimport { storageGuides } from \"./data/storage-guides.js\";\nimport { iconGuide } from \"./data/icon-guide.js\";\nimport {\n packages,\n getPackagesByCategory,\n} from \"./data/packages.js\";\nimport {\n recipes,\n getRecipesByCategory,\n} from \"./data/recipes.js\";\n\n// Import tool definitions and handler from the extracted tools module\nimport { toolDefinitions, callTool } from \"./tools/index.js\";\n\nconst server = new Server(\n {\n name: \"@idealyst/mcp-server\",\n version: \"1.0.94\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n);\n\n// List all available tools\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: toolDefinitions,\n };\n});\n\n// Handle tool calls\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n return callTool(name, args || {});\n});\n\n// List available resources\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"idealyst://packages/overview\",\n name: \"Idealyst Packages Overview\",\n description: \"Overview of all available @idealyst packages organized by category\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://recipes/overview\",\n name: \"Idealyst Recipes Overview\",\n description: \"Overview of all available code recipes for common UI patterns\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/getting-started\",\n name: \"Getting Started with Idealyst\",\n description: \"Complete guide to setting up and using the Idealyst framework\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/components-overview\",\n name: \"Components Overview\",\n description: \"Overview of all available Idealyst components organized by category\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/theming\",\n name: \"Theming Guide\",\n description: \"Guide to customizing themes in Idealyst\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/cli\",\n name: \"CLI Reference\",\n description: \"Complete reference for the Idealyst CLI\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/overview\",\n name: \"Navigation System Overview\",\n description: \"Overview of the Idealyst navigation system for cross-platform routing\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/route-configuration\",\n name: \"Route Configuration\",\n description: \"Learn how to define and structure routes in Idealyst\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/navigator-types\",\n name: \"Navigator Types\",\n description: \"Guide to stack, tab, drawer, and modal navigators\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/custom-layouts\",\n name: \"Custom Layouts (Web)\",\n description: \"Creating custom layouts with headers and sidebars for web applications\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/use-navigator\",\n name: \"useNavigator Hook\",\n description: \"Complete reference for the useNavigator hook API\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/web-mobile-parity\",\n name: \"Web/Mobile Navigation Parity\",\n description: \"How to achieve native-like navigation UI on web using layout components\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://icons/reference\",\n name: \"Icon Reference Guide\",\n description: \"Complete guide to Material Design Icons with 7,447 available icons, common icons by category, and usage examples\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/overview\",\n name: \"Translation Overview\",\n description: \"Overview of @idealyst/translate internationalization package\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/runtime-api\",\n name: \"Translation Runtime API\",\n description: \"Complete reference for TranslateProvider, useTranslation, useLanguage, and Trans component\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/babel-plugin\",\n name: \"Translation Babel Plugin\",\n description: \"Guide to the Babel plugin for static key extraction and missing translation detection\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/translation-files\",\n name: \"Translation File Format\",\n description: \"Guide to organizing and formatting translation JSON files\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/examples\",\n name: \"Translation Examples\",\n description: \"Complete code examples for common translation patterns\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/overview\",\n name: \"Storage Overview\",\n description: \"Overview of @idealyst/storage cross-platform storage package\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/api\",\n name: \"Storage API Reference\",\n description: \"Complete API reference for @idealyst/storage\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/examples\",\n name: \"Storage Examples\",\n description: \"Complete code examples for common storage patterns\",\n mimeType: \"text/markdown\",\n },\n ],\n };\n});\n\n// Handle resource reads\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n // Check all guide sources\n let guide = frameworkGuides[uri] || navigationGuides[uri] || translateGuides[uri] || storageGuides[uri];\n\n // Handle icon reference\n if (uri === \"idealyst://icons/reference\") {\n guide = iconGuide;\n }\n\n // Handle recipes overview\n if (uri === \"idealyst://recipes/overview\") {\n const byCategory = getRecipesByCategory();\n const categoryLabels: Record<string, string> = {\n auth: \"Authentication\",\n forms: \"Forms & Validation\",\n navigation: \"Navigation\",\n data: \"Data & Lists\",\n layout: \"Layout & Modals\",\n settings: \"Settings & Preferences\",\n media: \"Media & Uploads\",\n };\n\n let content = `# Idealyst Recipes\n\nReady-to-use code examples for common UI patterns in Idealyst apps.\n\n`;\n\n for (const [category, recipeList] of Object.entries(byCategory)) {\n content += `## ${categoryLabels[category] || category}\\n\\n`;\n\n for (const recipe of recipeList) {\n const id = Object.entries(recipes).find(([_, r]) => r === recipe)?.[0];\n content += `### ${recipe.name}\n${recipe.description}\n\n- **Difficulty:** ${recipe.difficulty}\n- **Packages:** ${recipe.packages.join(\", \")}\n- **Get recipe:** \\`get_recipe({ recipe: \"${id}\" })\\`\n\n`;\n }\n }\n\n guide = content;\n }\n\n // Handle packages overview\n if (uri === \"idealyst://packages/overview\") {\n const byCategory = getPackagesByCategory();\n const categoryOrder = [\"core\", \"ui\", \"data\", \"media\", \"auth\", \"utility\", \"tooling\"];\n const categoryLabels: Record<string, string> = {\n core: \"Core Packages\",\n ui: \"UI Components\",\n data: \"Data & Storage\",\n media: \"Media & Hardware\",\n auth: \"Authentication\",\n utility: \"Utilities\",\n tooling: \"Developer Tooling\",\n };\n\n let content = `# Idealyst Framework Packages\n\nThe Idealyst Framework provides a comprehensive set of packages for building cross-platform React applications.\n\n`;\n\n for (const category of categoryOrder) {\n const pkgs = byCategory[category];\n if (!pkgs || pkgs.length === 0) continue;\n\n content += `## ${categoryLabels[category] || category}\\n\\n`;\n\n for (const pkg of pkgs) {\n const platforms = pkg.platforms.join(\", \");\n content += `### ${pkg.name} (\\`${pkg.npmName}\\`)\n${pkg.description}\n\n- **Platforms:** ${platforms}\n- **Install:** \\`${pkg.installation}\\`\n\n`;\n }\n }\n\n guide = content;\n }\n\n if (!guide) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: \"text/markdown\",\n text: guide,\n },\n ],\n };\n});\n\n// Start the server\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"Idealyst MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","export const frameworkGuides: Record<string, string> = {\n \"idealyst://framework/getting-started\": `# Getting Started with Idealyst\n\nIdealyst is a modern, cross-platform framework for building React and React Native applications with a powerful component library, type-safe APIs, and monorepo tooling.\n\n## Quick Start\n\n### 1. Create a New Workspace\n\n\\`\\`\\`bash\nnpx @idealyst/cli init my-app\ncd my-app\n\\`\\`\\`\n\nThis single command creates a **complete monorepo workspace** with all 5 packages:\n- \\`packages/web/\\` - React web app (Vite)\n- \\`packages/native/\\` - React Native mobile app\n- \\`packages/api/\\` - tRPC API server with GraphQL\n- \\`packages/database/\\` - Prisma database layer\n- \\`packages/shared/\\` - Shared utilities and tRPC client\n\nPlus:\n- Yarn 3 workspace setup\n- TypeScript configuration\n- Jest testing setup\n- Git repository\n- Dev container configuration\n\n### 2. Start Development\n\n\\`\\`\\`bash\n# Start web dev server\ncd packages/web\nyarn dev\n\n# Start native dev (in another terminal)\ncd packages/native\nyarn start\n\n# Start API server (in another terminal)\ncd packages/api\nyarn dev\n\\`\\`\\`\n\n### 3. Configure Babel (Required for Styling)\n\nAdd the Idealyst plugin to your babel.config.js:\n\n\\`\\`\\`javascript\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/theme/plugin', {\n themePath: './src/theme/styles.ts', // Path to your theme file\n }],\n ],\n};\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\nmy-app/\n├── packages/\n│ ├── web/ # React web app (Vite)\n│ ├── native/ # React Native app\n│ ├── api/ # tRPC + GraphQL API server\n│ ├── database/ # Prisma database layer\n│ └── shared/ # Shared utilities & tRPC client\n├── package.json\n├── tsconfig.json\n└── yarn.lock\n\\`\\`\\`\n\n## Key Features\n\n- **Cross-Platform Components**: Use the same components for web and native\n- **Type-Safe APIs**: End-to-end type safety with tRPC\n- **Modern Tooling**: Vite, TypeScript, Jest, Prisma\n- **Monorepo Structure**: Share code across packages\n- **Theme System**: Consistent styling with react-native-unistyles\n- **Style Extensions**: Customize component styles at build time\n- **Navigation**: Unified navigation for web and native\n\n## Next Steps\n\n1. Explore the component library: \\`@idealyst/components\\`\n2. Learn the style system: \\`idealyst://framework/style-system\\`\n3. Set up your database schema in \\`packages/database\\`\n4. Define your API routes in \\`packages/api\\`\n5. Build your UI using Idealyst components\n`,\n\n \"idealyst://framework/components-overview\": `# Idealyst Components Overview\n\nIdealyst provides a comprehensive library of cross-platform React components organized into categories.\n\n## Component Categories\n\n### Layout Components\n- **View**: Flex container with spacing system\n- **Screen**: Full-screen container with safe area handling\n- **Divider**: Visual separator with orientation options\n\n### Form Components\n- **Button**: Interactive button with variants, intents, and icons\n- **Input**: Text input with label, validation, and helper text\n- **Checkbox**: Form checkbox with label support\n- **Select**: Dropdown selection component\n- **Switch**: Toggle switch component\n- **RadioButton**: Radio button group\n- **Slider**: Range slider component\n- **TextArea**: Multi-line text input\n\n### Display Components\n- **Text**: Styled text with sizes and weights\n- **Card**: Content container with variants\n- **Badge**: Status indicator\n- **Chip**: Compact element for tags and filters\n- **Avatar**: User profile image\n- **Icon**: MDI icon with theming\n- **Skeleton**: Loading placeholder\n- **Alert**: Notification message\n- **Accordion**: Collapsible content sections\n- **Image**: Cross-platform image component\n- **SVGImage**: SVG image renderer\n- **Video**: Video player component\n\n### Navigation Components\n- **Tabs**: Tab navigation\n- **TabBar**: Bottom tab bar\n- **Breadcrumb**: Breadcrumb navigation\n- **Menu**: Dropdown menu\n- **MenuItem**: Individual menu item\n- **List**: Vertical list with sections\n- **ListItem**: Individual list item\n- **Link**: Navigation link component\n\n### Overlay Components\n- **Dialog**: Modal dialog\n- **Popover**: Contextual overlay\n- **Tooltip**: Hover tooltip\n\n### Feedback Components\n- **Progress**: Progress indicator (linear/circular)\n- **ActivityIndicator**: Loading spinner\n\n### Data Components\n- **Table**: Data table with sorting and filtering\n- **DataGrid**: Advanced data grid\n- **DatePicker**: Date selection component\n- **TimePicker**: Time selection component\n- **DateTimePicker**: Combined date and time picker\n\n## Common Props\n\nMost components share common props:\n- \\`style\\`: Custom styles\n- \\`testID\\`: Test identifier\n- \\`disabled\\`: Disable interaction\n\n### Intent Colors\nComponents support intent-based colors:\n- \\`primary\\`: Main brand actions\n- \\`neutral\\`: Secondary actions\n- \\`success\\`: Positive actions\n- \\`error\\`: Destructive actions\n- \\`warning\\`: Caution actions\n\n### Type/Variant Props\nMany components offer visual type or variant options:\n- Button \\`type\\`: \\`contained\\`, \\`outlined\\`, \\`text\\`\n- Card \\`type\\`: \\`default\\`, \\`outlined\\`, \\`elevated\\`, \\`filled\\`\n- Chip \\`type\\`: \\`filled\\`, \\`outlined\\`, \\`soft\\`\n- Progress \\`variant\\`: \\`linear\\`, \\`circular\\`\n\n### Sizes\nMost components support size variants:\n- \\`sm\\`, \\`md\\`, \\`lg\\`\n- Sometimes 'xs' and 'xl', but varies by component\n\n## Icon Support\n\nComponents with icon support accept:\n- **String icon names**: Material Design Icons\n- **React elements**: Custom icon components\n\nExample:\n\\`\\`\\`tsx\n<Button leftIcon=\"check\">Save</Button>\n<Button leftIcon={<CustomIcon />}>Save</Button>\n<Button rightIcon=\"arrow-right\">Next</Button>\n\\`\\`\\`\n\n## Theming\n\nAll components use the Unistyles theming system:\n- Light and dark mode support\n- Customizable color palettes\n- Responsive breakpoints\n- Platform-specific styles\n\n## Import Pattern\n\n\\`\\`\\`tsx\nimport { Button, Card, Text, View } from '@idealyst/components';\n\\`\\`\\`\n`,\n\n \"idealyst://framework/theming\": `# Theming Guide\n\nIdealyst uses react-native-unistyles for cross-platform theming with full TypeScript support. Themes are created using a fluent builder pattern.\n\n## Theme Builder API\n\nCreate themes using the builder pattern:\n\n\\`\\`\\`typescript\nimport { createTheme } from '@idealyst/theme';\n\nexport const myTheme = createTheme()\n // Add semantic intents\n .addIntent('primary', {\n primary: '#3b82f6', // Main color\n contrast: '#ffffff', // Text on primary background\n light: '#bfdbfe', // Lighter variant\n dark: '#1e40af', // Darker variant\n })\n .addIntent('success', {\n primary: '#22c55e',\n contrast: '#ffffff',\n light: '#a7f3d0',\n dark: '#165e29',\n })\n .addIntent('danger', {\n primary: '#ef4444',\n contrast: '#ffffff',\n light: '#fca5a1',\n dark: '#9b2222',\n })\n\n // Add border radii\n .addRadius('none', 0)\n .addRadius('sm', 4)\n .addRadius('md', 8)\n .addRadius('lg', 12)\n\n // Add shadows (cross-platform)\n .addShadow('sm', {\n elevation: 1,\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.08,\n shadowRadius: 1,\n boxShadow: '0px 1px 2px rgba(0, 0, 0, 0.1)', // web-only\n })\n\n // Set colors\n .setColors({\n pallet: { /* color palette */ },\n surface: {\n screen: '#ffffff',\n primary: '#ffffff',\n secondary: '#f5f5f5',\n inverse: '#000000',\n },\n text: {\n primary: '#000000',\n secondary: '#333333',\n inverse: '#ffffff',\n },\n border: {\n primary: '#e0e0e0',\n disabled: '#f0f0f0',\n },\n })\n\n // Set component sizes (xs, sm, md, lg, xl)\n .setSizes({\n button: {\n xs: { paddingVertical: 4, paddingHorizontal: 8, minHeight: 24, fontSize: 12 },\n sm: { paddingVertical: 6, paddingHorizontal: 12, minHeight: 32, fontSize: 14 },\n md: { paddingVertical: 8, paddingHorizontal: 16, minHeight: 40, fontSize: 16 },\n lg: { paddingVertical: 10, paddingHorizontal: 20, minHeight: 48, fontSize: 18 },\n xl: { paddingVertical: 12, paddingHorizontal: 24, minHeight: 56, fontSize: 20 },\n },\n // ... other components (chip, badge, icon, input, etc.)\n })\n\n // Set interaction styles\n .setInteraction({\n focusedBackground: 'rgba(59, 130, 246, 0.08)',\n focusBorder: 'rgba(59, 130, 246, 0.3)',\n opacity: { hover: 0.9, active: 0.75, disabled: 0.5 },\n })\n\n // Set responsive breakpoints\n .setBreakpoints({\n xs: 0, // Portrait phones\n sm: 576, // Landscape phones\n md: 768, // Tablets\n lg: 992, // Desktops\n xl: 1200, // Large desktops\n })\n\n .build();\n\\`\\`\\`\n\n## Intent Structure\n\nEach intent defines four color values:\n\n| Property | Purpose |\n|------------|-----------------------------------|\n| \\`primary\\` | Main color used for backgrounds |\n| \\`contrast\\` | Text color on primary background |\n| \\`light\\` | Lighter tint for subtle states |\n| \\`dark\\` | Darker shade for pressed states |\n\n## Extending an Existing Theme\n\nUse \\`fromTheme()\\` to extend a base theme:\n\n\\`\\`\\`typescript\nimport { fromTheme, lightTheme } from '@idealyst/theme';\n\nexport const brandTheme = fromTheme(lightTheme)\n .addIntent('brand', {\n primary: '#6366f1',\n contrast: '#ffffff',\n light: '#818cf8',\n dark: '#4f46e5',\n })\n .build();\n\\`\\`\\`\n\n## Modifying Intents\n\n### setIntent() - Replace an existing intent\n\nUse \\`setIntent()\\` to override an intent from a base theme:\n\n\\`\\`\\`typescript\nconst customTheme = fromTheme(lightTheme)\n .setIntent('primary', {\n primary: '#6366f1', // Change brand color\n contrast: '#ffffff',\n light: '#a5b4fc',\n dark: '#4338ca',\n })\n .build();\n\\`\\`\\`\n\n## Modifying Colors\n\n### Individual Color Methods\n\nInstead of replacing all colors with \\`setColors()\\`, you can add or modify individual colors:\n\n\\`\\`\\`typescript\nconst theme = fromTheme(lightTheme)\n // Add new surface colors\n .addSurfaceColor('card', '#ffffff')\n .addSurfaceColor('modal', 'rgba(0,0,0,0.5)')\n\n // Replace existing surface colors\n .setSurfaceColor('screen', '#fafafa')\n\n // Add new text colors\n .addTextColor('muted', '#9ca3af')\n .addTextColor('link', '#3b82f6')\n\n // Replace existing text colors\n .setTextColor('primary', '#111827')\n\n // Add new border colors\n .addBorderColor('focus', '#3b82f6')\n .addBorderColor('error', '#ef4444')\n\n // Replace existing border colors\n .setBorderColor('primary', '#d1d5db')\n\n // Add new pallet colors (full shade set)\n .addPalletColor('brand', {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n })\n\n // Replace existing pallet colors\n .setPalletColor('blue', { /* new shades */ })\n\n .build();\n\\`\\`\\`\n\n### Color Method Reference\n\n| Method | Purpose | Type Change |\n|--------|---------|-------------|\n| \\`addSurfaceColor(name, value)\\` | Add new surface color | Expands type union |\n| \\`setSurfaceColor(name, value)\\` | Replace existing surface color | No type change |\n| \\`addTextColor(name, value)\\` | Add new text color | Expands type union |\n| \\`setTextColor(name, value)\\` | Replace existing text color | No type change |\n| \\`addBorderColor(name, value)\\` | Add new border color | Expands type union |\n| \\`setBorderColor(name, value)\\` | Replace existing border color | No type change |\n| \\`addPalletColor(name, shades)\\` | Add new pallet with all shades | Expands type union |\n| \\`setPalletColor(name, shades)\\` | Replace existing pallet | No type change |\n\n## Registering Your Theme\n\nFor full TypeScript inference:\n\n\\`\\`\\`typescript\n// src/theme/styles.ts\nexport const myTheme = createTheme()\n // ... builder chain\n .build();\n\n// Register the theme type\ndeclare module '@idealyst/theme' {\n interface RegisteredTheme {\n theme: typeof myTheme;\n }\n}\n\\`\\`\\`\n\n## Using Themes with Unistyles\n\n\\`\\`\\`typescript\nimport { UnistylesRegistry } from 'react-native-unistyles';\nimport { lightTheme, darkTheme } from '@idealyst/theme';\n\nUnistylesRegistry\n .addThemes({\n light: lightTheme,\n dark: darkTheme,\n })\n .addConfig({\n initialTheme: 'light',\n });\n\\`\\`\\`\n\n## Platform-Specific Styles\n\n\\`\\`\\`typescript\nconst styles = StyleSheet.create((theme) => ({\n button: {\n padding: 16,\n\n _web: {\n cursor: 'pointer',\n transition: 'all 0.1s ease',\n _hover: { opacity: 0.9 },\n _active: { opacity: 0.75 },\n },\n\n _native: {\n elevation: 2,\n },\n },\n}));\n\\`\\`\\`\n\n## See Also\n\n- \\`idealyst://framework/style-system\\` - Style definition APIs (defineStyle, extendStyle)\n- \\`idealyst://framework/babel-plugin\\` - Babel plugin configuration\n- \\`idealyst://framework/breakpoints\\` - Responsive breakpoint system\n`,\n\n \"idealyst://framework/cli\": `# Idealyst CLI Reference\n\nThe Idealyst CLI provides commands for creating and managing Idealyst projects.\n\n## Installation\n\n\\`\\`\\`bash\nnpm install -g @idealyst/cli\n# or\nnpx @idealyst/cli <command>\n\\`\\`\\`\n\n## Commands\n\n### init\n\nInitialize a new Idealyst workspace.\n\n\\`\\`\\`bash\nidealyst init <workspace-name> [options]\n\\`\\`\\`\n\n**Arguments:**\n- \\`workspace-name\\`: Name for the workspace directory\n\n**Options:**\n- \\`--git\\`: Initialize git repository (default: true)\n- \\`--no-git\\`: Skip git initialization\n- \\`--install\\`: Install dependencies (default: true)\n- \\`--no-install\\`: Skip dependency installation\n\n**Examples:**\n\\`\\`\\`bash\nidealyst init my-app\nidealyst init my-company-app --no-git\n\\`\\`\\`\n\n**Creates:**\n- Monorepo workspace structure\n- package.json with workspaces\n- TypeScript configuration\n- Jest setup\n- Git repository (optional)\n- Dev container configuration\n\n### create\n\nCreate a new package in the workspace.\n\n\\`\\`\\`bash\nidealyst create <name> --type <type> [options]\n\\`\\`\\`\n\n**Arguments:**\n- \\`name\\`: Package name\n\n**Options:**\n- \\`--type <type>\\`: Package type (required)\n - \\`web\\`: React web app with Vite\n - \\`mobile\\`: React Native mobile app\n - \\`api\\`: tRPC API server\n - \\`shared\\`: Shared utilities library\n- \\`--app-name <name>\\`: Display name for mobile apps (required for mobile)\n- \\`--with-trpc\\`: Include tRPC setup (web/mobile)\n- \\`--no-trpc\\`: Exclude tRPC setup (web/mobile)\n\n**Examples:**\n\\`\\`\\`bash\n# Web app\nidealyst create web --type web --with-trpc\n\n# Mobile app\nidealyst create mobile --type mobile --app-name \"My App\" --with-trpc\n\n# API server\nidealyst create api --type api\n\n# Shared library\nidealyst create shared --type shared\n\\`\\`\\`\n\n**Note:** The database package is automatically created during workspace initialization. Use the \\`init\\` command to create a new workspace with all packages including database.\n\n## Package Types\n\n### Web Package\n- Vite + React 19\n- TypeScript\n- React Router\n- Optional tRPC client\n- @idealyst/components\n- @idealyst/theme\n\n### Mobile Package\n- React Native 0.80\n- TypeScript\n- React Navigation\n- Optional tRPC client\n- @idealyst/components\n- @idealyst/navigation\n\n### API Package\n- tRPC server\n- Express\n- TypeScript\n- CORS enabled\n- WebSocket support\n\n### Database Package\n- Prisma ORM\n- TypeScript\n- Schema definition\n- Migration support\n- Multiple database support\n\n### Shared Package\n- TypeScript library\n- Utility functions\n- Type definitions\n- Shared between packages\n\n## Workspace Commands\n\nRun these from workspace root:\n\n\\`\\`\\`bash\n# Install all dependencies\nyarn install\n\n# Run tests\nyarn test\nyarn test:watch\nyarn test:coverage\n\n# Build all packages\nyarn workspaces foreach run build\n\n# Version management\nyarn version:patch # Bump patch version\nyarn version:minor # Bump minor version\nyarn version:major # Bump major version\n\n# Publish\nyarn publish:all\n\\`\\`\\`\n\n## Package Commands\n\nRun these from package directory:\n\n\\`\\`\\`bash\n# Development\nyarn dev\n\n# Build\nyarn build\n\n# Test\nyarn test\n\n# Type check\nyarn type-check\n\n# Lint\nyarn lint\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\nworkspace/\n├── packages/\n│ ├── web/\n│ │ ├── src/\n│ │ ├── public/\n│ │ ├── package.json\n│ │ └── vite.config.ts\n│ ├── mobile/\n│ │ ├── src/\n│ │ ├── android/\n│ │ ├── ios/\n│ │ └── package.json\n│ ├── api/\n│ │ ├── src/\n│ │ ├── trpc/\n│ │ └── package.json\n│ ├── database/\n│ │ ├── prisma/\n│ │ └── package.json\n│ └── shared/\n│ ├── src/\n│ └── package.json\n├── package.json\n├── tsconfig.json\n└── jest.config.js\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use workspaces**: Keep related packages in the same workspace\n2. **Share code**: Use the shared package for utilities\n3. **Type safety**: Enable strict TypeScript\n4. **Testing**: Write tests for critical functionality\n5. **Versioning**: Keep package versions synchronized\n6. **Documentation**: Add README files to packages\n7. **Git**: Use conventional commits\n8. **Dependencies**: Share dependencies across packages when possible\n`,\n\n \"idealyst://framework/spacing-system\": `# Spacing System\n\nIdealyst components use a variant-based spacing system for consistent layouts. Instead of specifying numeric values, you use Size variants (xs, sm, md, lg, xl) that map to theme-defined values.\n\n## Spacing Prop Interfaces\n\nDifferent component types receive different spacing props based on their use case:\n\n### ContainerStyleProps (Layout Containers)\n**Components**: View, Card, Screen, List, Accordion, Table, TabBar\n\n\\`\\`\\`typescript\ninterface ContainerStyleProps {\n gap?: Size; // Space between children\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n margin?: Size; // Margin on all sides\n marginVertical?: Size; // Top and bottom margin\n marginHorizontal?: Size; // Left and right margin\n}\n\\`\\`\\`\n\n### TextSpacingStyleProps (Text Components)\n**Components**: Text\n\n\\`\\`\\`typescript\ninterface TextSpacingStyleProps {\n gap?: Size; // Space between nested elements\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n}\n\\`\\`\\`\n\n### PressableSpacingStyleProps (Interactive Elements)\n**Components**: Pressable\n\n\\`\\`\\`typescript\ninterface PressableSpacingStyleProps {\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n}\n\\`\\`\\`\n\n### FormInputStyleProps (Form Inputs)\n**Components**: Input, Select, TextArea, Checkbox, RadioButton, Switch, Slider\n\n\\`\\`\\`typescript\ninterface FormInputStyleProps {\n margin?: Size; // Margin on all sides\n marginVertical?: Size; // Top and bottom margin\n marginHorizontal?: Size; // Left and right margin\n}\n\\`\\`\\`\n\n## Size Values\n\nSize variants map to theme values:\n\n| Size | Padding | Spacing (Gap) |\n|------|---------|---------------|\n| xs | 4px | 4px |\n| sm | 8px | 8px |\n| md | 16px | 16px |\n| lg | 24px | 24px |\n| xl | 32px | 32px |\n\n## Usage Examples\n\n### Container Spacing\n\n\\`\\`\\`tsx\nimport { View, Card, Text } from '@idealyst/components';\n\n// Gap between children\n<View gap=\"md\">\n <Text>Item 1</Text>\n <Text>Item 2</Text>\n</View>\n\n// Padding inside container\n<Card padding=\"lg\" gap=\"sm\">\n <Text weight=\"bold\">Card Title</Text>\n <Text>Card content</Text>\n</Card>\n\n// Directional padding\n<View paddingVertical=\"md\" paddingHorizontal=\"lg\">\n <Text>Content with different vertical/horizontal padding</Text>\n</View>\n\n// Margin for spacing between containers\n<Card margin=\"md\" padding=\"lg\">\n <Text>Card with margin</Text>\n</Card>\n\\`\\`\\`\n\n### Form Input Spacing\n\n\\`\\`\\`tsx\nimport { Input, Checkbox, View } from '@idealyst/components';\n\n// Use margin to space form fields\n<View>\n <Input placeholder=\"Email\" marginVertical=\"sm\" />\n <Input placeholder=\"Password\" marginVertical=\"sm\" />\n <Checkbox label=\"Remember me\" marginVertical=\"md\" />\n</View>\n\\`\\`\\`\n\n### Combining with Style Prop\n\nThe spacing props work alongside the style prop:\n\n\\`\\`\\`tsx\n<View\n gap=\"md\"\n padding=\"lg\"\n style={{ backgroundColor: '#f5f5f5', borderRadius: 8 }}\n>\n <Text>Content</Text>\n</View>\n\\`\\`\\`\n\n## Custom Components\n\nYou can use the exported builder functions to add spacing variants to custom components:\n\n\\`\\`\\`typescript\nimport { StyleSheet } from 'react-native-unistyles';\nimport { Theme } from '@idealyst/theme';\nimport {\n buildGapVariants,\n buildPaddingVariants,\n buildMarginVariants,\n} from '@idealyst/components';\n\nexport const customStyles = StyleSheet.create((theme: Theme) => ({\n container: {\n variants: {\n gap: buildGapVariants(theme),\n padding: buildPaddingVariants(theme),\n margin: buildMarginVariants(theme),\n },\n },\n}));\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use variants for consistency**: Prefer Size variants over numeric values for consistent spacing across your app\n2. **Gap over margins for children**: Use \\`gap\\` to space children instead of margins on individual items\n3. **Directional props for precision**: Use paddingVertical/paddingHorizontal when you need different spacing\n4. **Form spacing with margin**: Use marginVertical on form inputs to create consistent form layouts\n5. **Combine with theme values**: The variant values come from the theme, ensuring consistency\n`,\n\n \"idealyst://framework/api-overview\": `# API Architecture Overview\n\nIdealyst provides a dual API architecture with both tRPC and GraphQL, giving you flexibility for different use cases.\n\n## When to Use Each\n\n### tRPC (Type-Safe RPC)\n- **Best for**: Internal clients, same-team consumption\n- **Benefits**: End-to-end type safety, no code generation, fast development\n- **Use when**: Your frontend and backend are TypeScript\n\n### GraphQL\n- **Best for**: Public APIs, third-party integrations, mobile apps\n- **Benefits**: Flexible queries, schema documentation, wide ecosystem\n- **Use when**: You need schema introspection or have non-TypeScript clients\n\n## Architecture\n\nBoth APIs run on the same Express server:\n\n\\`\\`\\`\nServer (port 3000)\n├── /trpc/* → tRPC handlers\n├── /graphql → GraphQL Yoga endpoint\n└── Shared context (database, auth)\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\npackages/api/src/\n├── routers/ # tRPC routers\n│ ├── index.ts # Root router\n│ └── test.ts # Example router\n├── graphql/ # GraphQL setup\n│ ├── builder.ts # Pothos schema builder\n│ ├── index.ts # Yoga server setup\n│ └── types/ # GraphQL type definitions\n│ └── test.ts # Example types\n├── context.ts # Shared context\n├── server.ts # Express server\n└── index.ts # Entry point\n\\`\\`\\`\n\n## Shared Context\n\nBoth APIs share the same context:\n\n\\`\\`\\`typescript\n// context.ts\nexport interface Context {\n db: PrismaClient;\n // Add auth, session, etc.\n}\n\nexport async function createContext(): Promise<Context> {\n return {\n db: prisma,\n };\n}\n\\`\\`\\`\n\n## Client Setup\n\nThe shared package provides clients for both:\n\n\\`\\`\\`typescript\n// In your App component\nimport { createTRPCClient, createGraphQLClient } from '@your-app/shared';\n\n// tRPC - automatic type inference\nconst trpcClient = createTRPCClient({ apiUrl: 'http://localhost:3000/trpc' });\n\n// GraphQL - manual queries with graphql-request\ncreateGraphQLClient({ apiUrl: 'http://localhost:3000/graphql' });\n\\`\\`\\`\n\n## Migration Path\n\nStart with tRPC for rapid development, add GraphQL when you need:\n- Public API documentation\n- Third-party integrations\n- Schema-first development\n- Non-TypeScript clients\n`,\n\n \"idealyst://framework/graphql-setup\": `# GraphQL Setup Guide\n\nIdealyst uses Pothos (code-first schema) with GraphQL Yoga server, integrated with Prisma.\n\n## Server Setup\n\n### 1. Schema Builder (builder.ts)\n\n\\`\\`\\`typescript\nimport SchemaBuilder from '@pothos/core';\nimport PrismaPlugin from '@pothos/plugin-prisma';\nimport type PrismaTypes from './generated';\nimport { prisma } from '@your-app/database';\n\nexport const builder = new SchemaBuilder<{\n PrismaTypes: PrismaTypes;\n Context: { db: typeof prisma };\n}>({\n plugins: [PrismaPlugin],\n prisma: {\n client: prisma,\n },\n});\n\n// Initialize Query and Mutation types\nbuilder.queryType({});\nbuilder.mutationType({});\n\\`\\`\\`\n\n### 2. Generate Prisma Types\n\n\\`\\`\\`bash\n# In packages/api\nnpx prisma generate --generator pothos\n\\`\\`\\`\n\nAdd to your prisma schema:\n\n\\`\\`\\`prisma\ngenerator pothos {\n provider = \"prisma-pothos-types\"\n output = \"../src/graphql/generated.ts\"\n}\n\\`\\`\\`\n\n### 3. Define Types (types/example.ts)\n\n\\`\\`\\`typescript\nimport { builder } from '../builder';\n\n// Object type from Prisma model\nbuilder.prismaObject('Test', {\n fields: (t) => ({\n id: t.exposeID('id'),\n name: t.exposeString('name'),\n message: t.exposeString('message'),\n status: t.exposeString('status'),\n createdAt: t.expose('createdAt', { type: 'DateTime' }),\n }),\n});\n\n// Input type for mutations\nconst CreateTestInput = builder.inputType('CreateTestInput', {\n fields: (t) => ({\n name: t.string({ required: true }),\n message: t.string({ required: true }),\n status: t.string({ required: true }),\n }),\n});\n\n// Query\nbuilder.queryField('tests', (t) =>\n t.prismaField({\n type: ['Test'],\n args: {\n take: t.arg.int(),\n skip: t.arg.int(),\n },\n resolve: async (query, _root, args, ctx) =>\n ctx.db.test.findMany({\n ...query,\n take: args.take ?? 10,\n skip: args.skip ?? 0,\n orderBy: { createdAt: 'desc' },\n }),\n })\n);\n\n// Mutation\nbuilder.mutationField('createTest', (t) =>\n t.prismaField({\n type: 'Test',\n args: {\n input: t.arg({ type: CreateTestInput, required: true }),\n },\n resolve: async (query, _root, args, ctx) =>\n ctx.db.test.create({\n ...query,\n data: args.input,\n }),\n })\n);\n\\`\\`\\`\n\n### 4. Yoga Server (index.ts)\n\n\\`\\`\\`typescript\nimport { createYoga } from 'graphql-yoga';\nimport { builder } from './builder';\nimport './types/test'; // Import all type definitions\n\nexport const yoga = createYoga({\n schema: builder.toSchema(),\n graphqlEndpoint: '/graphql',\n});\n\\`\\`\\`\n\n### 5. Mount in Express (server.ts)\n\n\\`\\`\\`typescript\nimport express from 'express';\nimport { yoga } from './graphql';\n\nconst app = express();\n\n// GraphQL endpoint\napp.use('/graphql', yoga);\n\n// tRPC endpoint\napp.use('/trpc', trpcMiddleware);\n\\`\\`\\`\n\n## Client Setup\n\n### 1. GraphQL Client (shared/src/graphql/client.ts)\n\n\\`\\`\\`typescript\nimport { GraphQLClient } from 'graphql-request';\n\nlet client: GraphQLClient | null = null;\n\nexport function createGraphQLClient(config: { apiUrl: string }) {\n client = new GraphQLClient(config.apiUrl);\n return client;\n}\n\nexport function getGraphQLClient(): GraphQLClient {\n if (!client) throw new Error('GraphQL client not initialized');\n return client;\n}\n\nexport { gql } from 'graphql-request';\n\\`\\`\\`\n\n### 2. Using with React Query\n\n\\`\\`\\`typescript\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { getGraphQLClient, gql } from '../graphql/client';\n\nconst TESTS_QUERY = gql\\`\n query GetTests($take: Int) {\n tests(take: $take) {\n id\n name\n message\n }\n }\n\\`;\n\nconst CREATE_TEST = gql\\`\n mutation CreateTest($input: CreateTestInput!) {\n createTest(input: $input) {\n id\n name\n }\n }\n\\`;\n\n// Query hook\nconst { data, isLoading } = useQuery({\n queryKey: ['graphql', 'tests'],\n queryFn: () => getGraphQLClient().request(TESTS_QUERY, { take: 10 }),\n});\n\n// Mutation hook\nconst queryClient = useQueryClient();\nconst mutation = useMutation({\n mutationFn: (input) => getGraphQLClient().request(CREATE_TEST, { input }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['graphql', 'tests'] });\n },\n});\n\\`\\`\\`\n\n## GraphQL Playground\n\nAccess the GraphQL playground at:\n\\`\\`\\`\nhttp://localhost:3000/graphql\n\\`\\`\\`\n\nFeatures:\n- Schema explorer\n- Query autocompletion\n- Documentation browser\n- Query history\n\n## Best Practices\n\n1. **Use Input Types**: Always use input types for mutations\n2. **Pagination**: Implement cursor-based pagination for lists\n3. **Error Handling**: Use Pothos error types\n4. **Authorization**: Add auth checks in resolvers\n5. **N+1 Prevention**: Use Prisma's query optimization\n`,\n\n \"idealyst://framework/style-system\": `# Style Definition System\n\nIdealyst provides a powerful style definition system with build-time transformations via Babel plugin.\n\n## Overview\n\nThe style system provides:\n- **defineStyle()**: Define base styles for components\n- **extendStyle()**: Merge additional styles with base styles\n- **overrideStyle()**: Completely replace component styles\n- **$iterator pattern**: Expand styles for all theme keys\n\n## defineStyle()\n\nDefine base styles for a component:\n\n\\`\\`\\`typescript\nimport { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\n// Wrap theme for $iterator support\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\nexport const buttonStyles = defineStyle('Button', (theme: Theme) => ({\n button: {\n borderRadius: theme.radii.md,\n backgroundColor: theme.intents.primary.primary,\n\n variants: {\n size: {\n // $iterator expands to all size keys (xs, sm, md, lg, xl)\n paddingVertical: theme.sizes.$button.paddingVertical,\n paddingHorizontal: theme.sizes.$button.paddingHorizontal,\n },\n disabled: {\n true: { opacity: 0.5 },\n false: { opacity: 1 },\n },\n },\n },\n text: {\n color: theme.intents.primary.contrast,\n variants: {\n size: {\n fontSize: theme.sizes.$button.fontSize,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## Dynamic Style Functions\n\nFor styles depending on runtime props:\n\n\\`\\`\\`typescript\nexport const buttonStyles = defineStyle('Button', (theme: Theme) => ({\n button: ({ intent = 'primary', type = 'contained' }: ButtonDynamicProps) => ({\n backgroundColor: type === 'contained'\n ? theme.intents[intent].primary\n : 'transparent',\n borderColor: type === 'outlined'\n ? theme.intents[intent].primary\n : 'transparent',\n }),\n}));\n\\`\\`\\`\n\n## Using Styles in Components\n\n\\`\\`\\`typescript\nimport { buttonStyles } from './Button.styles';\n\nconst Button = ({ size = 'md', disabled = false, intent, type }) => {\n // Apply variants\n buttonStyles.useVariants({ size, disabled });\n\n // Static styles - no function call\n const staticStyle = buttonStyles.button;\n\n // Dynamic styles - function call with props\n const dynamicStyle = (buttonStyles.button as any)({ intent, type });\n\n return (\n <TouchableOpacity style={dynamicStyle}>\n <Text style={buttonStyles.text}>Click me</Text>\n </TouchableOpacity>\n );\n};\n\\`\\`\\`\n\n## extendStyle()\n\nMerge additional styles with base component styles:\n\n\\`\\`\\`typescript\n// style-extensions.ts\nimport { extendStyle } from '@idealyst/theme';\n\nextendStyle('Button', (theme) => ({\n button: {\n borderRadius: 9999, // Make all buttons pill-shaped\n },\n text: {\n fontFamily: 'CustomFont',\n },\n}));\n\\`\\`\\`\n\n## overrideStyle()\n\nCompletely replace component styles:\n\n\\`\\`\\`typescript\nimport { overrideStyle } from '@idealyst/theme';\n\noverrideStyle('Button', (theme) => ({\n button: {\n backgroundColor: theme.colors.surface.primary,\n borderWidth: 2,\n borderColor: theme.intents.primary.primary,\n },\n text: {\n color: theme.intents.primary.primary,\n },\n}));\n\\`\\`\\`\n\n## Import Order Matters\n\nExtensions must be imported **before** components:\n\n\\`\\`\\`typescript\n// App.tsx\nimport './style-extensions'; // FIRST - registers extensions\nimport { Button } from '@idealyst/components'; // SECOND - uses extensions\n\\`\\`\\`\n\n## When to Use Each\n\n| API | Use When |\n|-----|----------|\n| \\`defineStyle()\\` | Creating component library styles |\n| \\`extendStyle()\\` | Adding/modifying specific properties |\n| \\`overrideStyle()\\` | Completely custom styling |\n\n## See Also\n\n- \\`idealyst://framework/theming\\` - Theme builder API\n- \\`idealyst://framework/babel-plugin\\` - Plugin configuration\n- \\`idealyst://framework/iterator-pattern\\` - $iterator expansion\n`,\n\n \"idealyst://framework/babel-plugin\": `# Idealyst Babel Plugin\n\nThe Idealyst Babel plugin transforms style definitions at build time.\n\n## Installation\n\nThe plugin is included with \\`@idealyst/theme\\`.\n\n## Configuration\n\n\\`\\`\\`javascript\n// babel.config.js\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/theme/plugin', {\n // REQUIRED: Path to your theme file\n themePath: './src/theme/styles.ts',\n\n // Optional: Enable debug logging\n debug: false,\n verbose: false,\n\n // Optional: Paths to auto-process\n autoProcessPaths: [\n '@idealyst/components',\n '@idealyst/datepicker',\n 'src/',\n ],\n }],\n ],\n};\n\\`\\`\\`\n\n## What the Plugin Does\n\n### 1. Transforms defineStyle() to StyleSheet.create()\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Button', (theme) => ({\n button: { backgroundColor: theme.intents.primary.primary }\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n button: { backgroundColor: theme.intents.primary.primary }\n}));\n\\`\\`\\`\n\n### 2. Expands $iterator Patterns\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Button', (theme) => ({\n button: {\n variants: {\n size: {\n paddingVertical: theme.sizes.$button.paddingVertical,\n },\n },\n },\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n button: {\n variants: {\n size: {\n xs: { paddingVertical: theme.sizes.button.xs.paddingVertical },\n sm: { paddingVertical: theme.sizes.button.sm.paddingVertical },\n md: { paddingVertical: theme.sizes.button.md.paddingVertical },\n lg: { paddingVertical: theme.sizes.button.lg.paddingVertical },\n xl: { paddingVertical: theme.sizes.button.xl.paddingVertical },\n },\n },\n },\n}));\n\\`\\`\\`\n\n### 3. Merges Extensions at Build Time\n\n\\`\\`\\`typescript\n// Extension (processed first)\nextendStyle('Button', (theme) => ({\n button: { borderRadius: 9999 },\n}));\n\n// Base (merges with extension)\ndefineStyle('Button', (theme) => ({\n button: { padding: 16 },\n}));\n\n// Result: { padding: 16, borderRadius: 9999 }\n\\`\\`\\`\n\n### 4. Expands Color Iterators\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Screen', (theme) => ({\n screen: {\n variants: {\n background: {\n backgroundColor: theme.colors.$surface,\n },\n },\n },\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n screen: {\n variants: {\n background: {\n screen: { backgroundColor: theme.colors.surface.screen },\n primary: { backgroundColor: theme.colors.surface.primary },\n secondary: { backgroundColor: theme.colors.surface.secondary },\n // ... expands to all surface color keys\n },\n },\n },\n}));\n\\`\\`\\`\n\n### 5. Removes extendStyle/overrideStyle Calls\n\nAfter capturing extension definitions, the plugin removes the calls from the output since all merging happens at build time.\n\n## Theme Analysis\n\nThe plugin statically analyzes your theme file to extract:\n- Intent names (primary, success, error, etc.)\n- Size keys (xs, sm, md, lg, xl)\n- Radius names (none, sm, md, lg)\n- Shadow names (none, sm, md, lg, xl)\n- Surface color keys (screen, primary, secondary, etc.)\n- Text color keys (primary, secondary, inverse, etc.)\n- Border color keys (primary, secondary, disabled, etc.)\n\nThis enables $iterator expansion without runtime overhead.\n\n## Troubleshooting\n\n### Styles Not Applying\n\n1. Verify \\`themePath\\` points to your theme file\n2. Clear bundler cache: \\`yarn start --reset-cache\\`\n3. Check \\`void StyleSheet;\\` marker exists in style files\n\n### Theme Changes Not Detected\n\n1. Restart Metro bundler (theme is analyzed once)\n2. Verify theme exports correctly\n\n### Debug Mode\n\nEnable verbose logging:\n\n\\`\\`\\`javascript\n['@idealyst/theme/plugin', {\n themePath: './src/theme/styles.ts',\n verbose: true,\n}],\n\\`\\`\\`\n`,\n\n \"idealyst://framework/breakpoints\": `# Responsive Breakpoints\n\nIdealyst provides a responsive breakpoint system built on Unistyles v3, enabling width-based responsive styling across web and native platforms.\n\n## Default Breakpoints\n\nThe default themes include 5 breakpoints:\n\n| Breakpoint | Min Width | Target Devices |\n|------------|-----------|----------------|\n| \\`xs\\` | 0px | Portrait phones |\n| \\`sm\\` | 576px | Landscape phones |\n| \\`md\\` | 768px | Tablets |\n| \\`lg\\` | 992px | Desktops |\n| \\`xl\\` | 1200px | Large desktops |\n\n## Defining Breakpoints\n\n### Using setBreakpoints()\n\nSet all breakpoints at once:\n\n\\`\\`\\`typescript\nimport { createTheme } from '@idealyst/theme';\n\nconst theme = createTheme()\n // ... other theme config\n .setBreakpoints({\n xs: 0, // Must have one breakpoint at 0\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n })\n .build();\n\\`\\`\\`\n\n### Using addBreakpoint()\n\nAdd breakpoints individually:\n\n\\`\\`\\`typescript\nimport { fromTheme, lightTheme } from '@idealyst/theme';\n\nconst theme = fromTheme(lightTheme)\n .addBreakpoint('xxl', 1400) // Add extra large breakpoint\n .addBreakpoint('xxxl', 1800) // Add even larger\n .build();\n\\`\\`\\`\n\n## Using Breakpoints in Styles\n\n### In StyleSheet.create()\n\nUse object notation for responsive values:\n\n\\`\\`\\`typescript\nimport { StyleSheet } from 'react-native-unistyles';\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n // Responsive padding\n padding: {\n xs: 8,\n md: 16,\n xl: 24,\n },\n\n // Responsive flex direction\n flexDirection: {\n xs: 'column',\n md: 'row',\n },\n\n // Responsive gap\n gap: {\n xs: 8,\n sm: 12,\n lg: 16,\n },\n },\n\n text: {\n fontSize: {\n xs: 14,\n md: 16,\n lg: 18,\n },\n },\n}));\n\\`\\`\\`\n\n### Cascading Behavior\n\nValues cascade up - if a breakpoint isn't defined, it uses the nearest smaller one:\n\n\\`\\`\\`typescript\npadding: {\n xs: 8, // Used for xs, sm (no sm defined)\n md: 16, // Used for md, lg (no lg defined)\n xl: 24, // Used for xl\n}\n\\`\\`\\`\n\n## Runtime Utilities\n\n### getCurrentBreakpoint()\n\nGet the current active breakpoint:\n\n\\`\\`\\`typescript\nimport { getCurrentBreakpoint } from '@idealyst/theme';\n\nconst current = getCurrentBreakpoint();\nconsole.log(current); // 'md'\n\\`\\`\\`\n\n### getBreakpoints()\n\nGet all registered breakpoints:\n\n\\`\\`\\`typescript\nimport { getBreakpoints } from '@idealyst/theme';\n\nconst breakpoints = getBreakpoints();\n// { xs: 0, sm: 576, md: 768, lg: 992, xl: 1200 }\n\\`\\`\\`\n\n### isBreakpointUp() / isBreakpointDown()\n\nCheck viewport against breakpoints:\n\n\\`\\`\\`typescript\nimport { isBreakpointUp, isBreakpointDown } from '@idealyst/theme';\n\nif (isBreakpointUp('md')) {\n // Tablet or larger\n}\n\nif (isBreakpointDown('md')) {\n // Mobile only (below tablet)\n}\n\\`\\`\\`\n\n### resolveResponsive()\n\nResolve a responsive value for the current breakpoint:\n\n\\`\\`\\`typescript\nimport { resolveResponsive } from '@idealyst/theme';\n\nconst padding = resolveResponsive({ xs: 8, md: 16, xl: 24 });\n// Returns 8 on mobile, 16 on tablet, 24 on desktop\n\\`\\`\\`\n\n## Responsive Type\n\nThe \\`Responsive<T>\\` type makes any value responsive:\n\n\\`\\`\\`typescript\nimport { Responsive, Size } from '@idealyst/theme';\n\n// Can be either a direct value or breakpoint map\ntype Props = {\n size: Responsive<Size>;\n};\n\n// Both are valid:\n<Component size=\"md\" />\n<Component size={{ xs: 'sm', md: 'lg' }} />\n\\`\\`\\`\n\n### Type Guard\n\nCheck if a value is responsive:\n\n\\`\\`\\`typescript\nimport { isResponsiveValue, Responsive, Size } from '@idealyst/theme';\n\nfunction handleSize(size: Responsive<Size>) {\n if (isResponsiveValue(size)) {\n // size is Partial<Record<Breakpoint, Size>>\n console.log(size.xs, size.md);\n } else {\n // size is Size\n console.log(size);\n }\n}\n\\`\\`\\`\n\n## TypeScript Support\n\nCustom breakpoints are fully typed:\n\n\\`\\`\\`typescript\nconst theme = createTheme()\n .setBreakpoints({\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n })\n .build();\n\n// Register for type inference\ndeclare module '@idealyst/theme' {\n interface CustomThemeRegistry {\n theme: typeof theme;\n }\n}\n\n// Now Breakpoint = 'mobile' | 'tablet' | 'desktop'\nimport { Breakpoint } from '@idealyst/theme';\n\\`\\`\\`\n\n## Unistyles Integration\n\nBreakpoints are automatically registered with Unistyles:\n\n\\`\\`\\`typescript\nimport { UnistylesRegistry } from 'react-native-unistyles';\nimport { lightTheme, darkTheme } from '@idealyst/theme';\n\nUnistylesRegistry\n .addThemes({ light: lightTheme, dark: darkTheme })\n .addBreakpoints(lightTheme.breakpoints) // Register breakpoints\n .addConfig({ initialTheme: 'light' });\n\\`\\`\\`\n\n## Cross-Platform Behavior\n\n- **Web**: Breakpoints convert to CSS media queries automatically\n- **Native**: Uses device screen width (works with tablets, phones, etc.)\n- **Same API**: Write once, works everywhere\n\n## Best Practices\n\n1. **Mobile-first**: Start with \\`xs\\` and add larger breakpoints as needed\n2. **Use cascading**: Don't define every breakpoint - let values cascade\n3. **Consistent breakpoints**: Use the same breakpoints across themes\n4. **Test on devices**: Verify layouts on actual device widths\n5. **Avoid over-responsiveness**: Not everything needs to change per breakpoint\n`,\n\n \"idealyst://framework/iterator-pattern\": `# The $iterator Pattern\n\nThe \\`$iterator\\` pattern allows defining styles once that expand to all keys of a theme object.\n\n## ThemeStyleWrapper\n\nWrap your theme type to enable $iterator properties:\n\n\\`\\`\\`typescript\nimport { ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\\`\\`\\`\n\nThis adds \\`$property\\` versions of iterable theme properties:\n\n| Original Path | $iterator Path |\n|----------------------------|-----------------------------|\n| \\`theme.intents.primary\\` | \\`theme.$intents.primary\\` |\n| \\`theme.sizes.button.md\\` | \\`theme.sizes.$button.md\\` |\n| \\`theme.colors.surface.screen\\` | \\`theme.colors.$surface\\` |\n| \\`theme.colors.text.primary\\` | \\`theme.colors.$text\\` |\n| \\`theme.colors.border.primary\\` | \\`theme.colors.$border\\` |\n\n## Usage Examples\n\n### Expand Intents\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n intent: {\n backgroundColor: theme.$intents.light,\n borderColor: theme.$intents.primary,\n },\n}\n\n// Expands to all intent keys (primary, success, danger, warning, etc.)\n// Result:\n// intent: {\n// primary: { backgroundColor: theme.intents.primary.light, borderColor: theme.intents.primary.primary },\n// success: { backgroundColor: theme.intents.success.light, borderColor: theme.intents.success.primary },\n// danger: { ... },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Sizes\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n size: {\n paddingVertical: theme.sizes.$button.paddingVertical,\n fontSize: theme.sizes.$button.fontSize,\n },\n}\n\n// Expands to all size keys (xs, sm, md, lg, xl)\n// Result:\n// size: {\n// xs: { paddingVertical: theme.sizes.button.xs.paddingVertical, fontSize: theme.sizes.button.xs.fontSize },\n// sm: { paddingVertical: theme.sizes.button.sm.paddingVertical, fontSize: theme.sizes.button.sm.fontSize },\n// md: { ... },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Surface Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n background: {\n backgroundColor: theme.colors.$surface,\n },\n}\n\n// Expands to all surface color keys (screen, primary, secondary, tertiary, inverse, etc.)\n// Result:\n// background: {\n// screen: { backgroundColor: theme.colors.surface.screen },\n// primary: { backgroundColor: theme.colors.surface.primary },\n// secondary: { backgroundColor: theme.colors.surface.secondary },\n// tertiary: { backgroundColor: theme.colors.surface.tertiary },\n// inverse: { backgroundColor: theme.colors.surface.inverse },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Text Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n color: {\n color: theme.colors.$text,\n },\n}\n\n// Expands to all text color keys (primary, secondary, tertiary, inverse, etc.)\n// Result:\n// color: {\n// primary: { color: theme.colors.text.primary },\n// secondary: { color: theme.colors.text.secondary },\n// tertiary: { color: theme.colors.text.tertiary },\n// inverse: { color: theme.colors.text.inverse },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Border Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n borderColor: {\n borderColor: theme.colors.$border,\n },\n}\n\n// Expands to all border color keys (primary, secondary, tertiary, disabled)\n// Result:\n// borderColor: {\n// primary: { borderColor: theme.colors.border.primary },\n// secondary: { borderColor: theme.colors.border.secondary },\n// tertiary: { borderColor: theme.colors.border.tertiary },\n// disabled: { borderColor: theme.colors.border.disabled },\n// }\n\\`\\`\\`\n\n## Complete Example\n\n\\`\\`\\`typescript\nimport { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\nexport const chipStyles = defineStyle('Chip', (theme: Theme) => ({\n chip: {\n borderRadius: 999,\n\n variants: {\n // Expand for all sizes\n size: {\n paddingVertical: theme.sizes.$chip.paddingVertical,\n paddingHorizontal: theme.sizes.$chip.paddingHorizontal,\n minHeight: theme.sizes.$chip.minHeight,\n },\n\n // Expand for all intents\n intent: {\n backgroundColor: theme.$intents.light,\n borderColor: theme.$intents.primary,\n },\n },\n },\n\n text: {\n variants: {\n size: {\n fontSize: theme.sizes.$chip.fontSize,\n lineHeight: theme.sizes.$chip.lineHeight,\n },\n\n intent: {\n color: theme.$intents.dark,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## createIteratorStyles()\n\nAlternative to defineStyle for custom components:\n\n\\`\\`\\`typescript\nimport { createIteratorStyles } from '@idealyst/theme';\n\nexport const styles = createIteratorStyles((theme) => ({\n box: {\n variants: {\n intent: {\n backgroundColor: theme.$intents.light,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## Supported Iterators\n\n| Iterator | Pattern | Expands To |\n|----------|---------|------------|\n| Intents | \\`theme.$intents.X\\` | All intent keys (primary, success, danger, etc.) |\n| Sizes | \\`theme.sizes.$component.X\\` | All size keys (xs, sm, md, lg, xl) |\n| Surface Colors | \\`theme.colors.$surface\\` | All surface color keys |\n| Text Colors | \\`theme.colors.$text\\` | All text color keys |\n| Border Colors | \\`theme.colors.$border\\` | All border color keys |\n\n## Benefits\n\n1. **DRY Code**: Define once, expand to many\n2. **Type Safety**: TypeScript validates iterator properties\n3. **Maintainable**: Adding new sizes/intents/colors to theme auto-expands\n4. **Zero Runtime Cost**: Expansion happens at build time\n`,\n};\n","export const navigationGuides: Record<string, string> = {\n \"idealyst://navigation/overview\": `# Navigation System Overview\n\nThe Idealyst navigation system provides a unified API for both React Native and web applications, handling routing seamlessly across platforms.\n\n## Core Concepts\n\n### Cross-Platform Routing\n- **Mobile (React Native)**: Uses React Navigation for native navigation patterns\n- **Web**: Uses React Router for browser-based routing\n- **Unified API**: Same code works on both platforms\n\n### Route Types\n\nThere are two fundamental route types:\n\n#### 1. Screen Routes\nRenders a component directly to the screen:\n\\`\\`\\`tsx\n{\n path: \"profile\",\n type: 'screen',\n component: ProfileScreen\n}\n\\`\\`\\`\n\n#### 2. Navigator Routes\nWraps child routes with navigation structure:\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'stack', // or 'tab', 'drawer', 'modal'\n routes: [\n { path: \"home\", type: 'screen', component: HomeScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n## Setup\n\n### Basic Setup\n\n\\`\\`\\`tsx\nimport { NavigatorProvider } from '@idealyst/navigation';\n\nfunction App() {\n return (\n <NavigatorProvider route={appRouter}>\n {/* Content managed by router */}\n </NavigatorProvider>\n );\n}\n\\`\\`\\`\n\n### Quick Start with Examples\n\nUse the pre-built example router for instant working navigation:\n\n\\`\\`\\`tsx\nimport { ExampleNavigationRouter } from '@idealyst/navigation/examples';\n\n<NavigatorProvider route={ExampleNavigationRouter} />\n\\`\\`\\`\n\nThe example router demonstrates:\n- Stack-based navigation structure\n- Custom web layouts with header and sidebar\n- Tab navigation for nested sections\n\n## Platform Differences\n\n### Mobile (React Native)\n- Stack navigator: Native stack navigation with animations\n- Tab navigator: Bottom tab bar\n- Drawer navigator: Side drawer with gestures\n- Modal navigator: Full-screen modal presentation\n\n### Web\n- Stack navigator: Browser history-based routing\n- Tab navigator: Top or side tab navigation\n- All navigators: Use URL paths for routing\n- Custom layouts: Can add headers, sidebars, footers\n\n## Key Features\n\n1. **Type-Safe Navigation**: Full TypeScript support\n2. **Path Parameters**: \\`/user/:id\\` support\n3. **Nested Routes**: Unlimited nesting depth\n4. **Custom Layouts**: Web-specific layout components\n5. **Theme Integration**: Works with @idealyst/theme\n6. **Cross-Platform**: Write once, run everywhere\n`,\n\n \"idealyst://navigation/route-configuration\": `# Route Configuration\n\nLearn how to define and structure routes in your Idealyst application.\n\n## Route Definition\n\n### Screen Route\n\nThe simplest route type - renders a component:\n\n\\`\\`\\`tsx\nimport { RouteParam } from '@idealyst/navigation';\n\nconst route: RouteParam = {\n path: \"profile\",\n type: 'screen',\n component: ProfileScreen,\n options: {\n title: \"User Profile\",\n headerShown: true\n }\n};\n\\`\\`\\`\n\n### Navigator Route\n\nA route that contains child routes:\n\n\\`\\`\\`tsx\nconst route: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n { path: \"home\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ],\n options: {\n headerShown: false\n }\n};\n\\`\\`\\`\n\n## Path Configuration\n\n### Basic Paths\n\n\\`\\`\\`tsx\n{ path: \"home\", ... } // Relative: /parent/home\n{ path: \"/home\", ... } // Absolute: /home\n{ path: \"\", ... } // Index route\n\\`\\`\\`\n\n### Path Parameters\n\n\\`\\`\\`tsx\n{\n path: \"user/:id\",\n type: 'screen',\n component: UserScreen\n}\n\n// Navigate with:\nnavigator.navigate({\n path: \"/user/:id\",\n vars: { id: \"123\" }\n});\n\n// Access in component:\nimport { useParams } from '@idealyst/navigation';\n\nconst params = useParams();\nconst userId = params.id;\n\\`\\`\\`\n\n### Optional Parameters\n\n\\`\\`\\`tsx\n{ path: \"search/:query?\" } // query is optional\n\\`\\`\\`\n\n## Screen Options\n\n### Common Options\n\n\\`\\`\\`tsx\ntype ScreenOptions = {\n title?: string; // Screen title\n headerShown?: boolean; // Show/hide header (mobile)\n};\n\\`\\`\\`\n\n### Tab-Specific Options\n\nFor tab navigators:\n\n\\`\\`\\`tsx\ntype TabBarScreenOptions = {\n tabBarIcon?: (props: {\n focused: boolean;\n color: string;\n size: string | number\n }) => React.ReactElement;\n\n tabBarLabel?: string; // Tab label\n tabBarBadge?: string | number; // Badge count\n tabBarVisible?: boolean; // Show/hide tab\n} & ScreenOptions;\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\n{\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ focused, color }) => (\n <Icon name=\"home\" color={color} />\n ),\n tabBarBadge: 5\n }\n}\n\\`\\`\\`\n\n## Navigator Options\n\nOptions for navigator routes:\n\n\\`\\`\\`tsx\ntype NavigatorOptions = {\n headerTitle?: React.ComponentType | React.ReactElement | string;\n headerLeft?: React.ComponentType | React.ReactElement;\n headerBackVisible?: boolean;\n headerRight?: React.ComponentType | React.ReactElement;\n headerShown?: boolean;\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\n{\n path: \"/app\",\n type: 'navigator',\n layout: 'stack',\n routes: [...],\n options: {\n headerTitle: \"My App\",\n headerShown: true,\n headerRight: <UserMenu />\n }\n}\n\\`\\`\\`\n\n## Invalid Route Handling\n\nNavigators can specify how to handle invalid routes:\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\n\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => (\n <View>\n <Text>Page not found: {path}</Text>\n </View>\n);\n\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n // Component to show when route is invalid\n notFoundComponent: NotFoundPage,\n // Handler to redirect or show 404\n onInvalidRoute: (path) => {\n if (path.startsWith('/old-')) {\n return { path: '/new-section', replace: true };\n }\n return undefined; // Show notFoundComponent\n },\n routes: [...]\n};\n\\`\\`\\`\n\nSee the **Invalid Route Handling** guide for complete documentation.\n\n## Nested Routes\n\nCreate hierarchical navigation:\n\n\\`\\`\\`tsx\nconst appRouter: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n {\n path: \"dashboard\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n { path: \"overview\", type: 'screen', component: OverviewScreen },\n { path: \"analytics\", type: 'screen', component: AnalyticsScreen },\n { path: \"reports\", type: 'screen', component: ReportsScreen },\n ]\n },\n {\n path: \"settings\",\n type: 'screen',\n component: SettingsScreen\n },\n ]\n};\n\\`\\`\\`\n\n## Full Path Resolution\n\nFull paths are automatically computed:\n- \\`/dashboard/overview\\`\n- \\`/dashboard/analytics\\`\n- \\`/dashboard/reports\\`\n- \\`/settings\\`\n\n## Best Practices\n\n1. **Use relative paths** for child routes\n2. **Keep nesting shallow** (3 levels max recommended)\n3. **Group related screens** in navigators\n4. **Use meaningful paths** that reflect content\n5. **Define index routes** with empty path\n6. **Set appropriate options** for each screen type\n`,\n\n \"idealyst://navigation/navigator-types\": `# Navigator Types\n\nIdealyst supports four navigator types: stack, tab, drawer, and modal. Each provides different navigation patterns.\n\n## Stack Navigator\n\nLinear, hierarchical navigation - the most common pattern.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/app\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Native stack navigation with slide animations\n- Hardware back button support\n- Swipe-to-go-back gesture\n\n**Web:**\n- Browser history integration\n- URL updates on navigation\n- Back/forward browser buttons work\n\n### Use Cases\n- Main app navigation\n- Detail views\n- Settings flows\n- Onboarding sequences\n\n## Tab Navigator\n\nSection-based navigation with a tab bar.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n {\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ color }) => <Icon name=\"home\" color={color} />\n }\n },\n {\n path: \"search\",\n type: 'screen',\n component: SearchScreen,\n options: {\n tabBarLabel: \"Search\",\n tabBarIcon: ({ color }) => <Icon name=\"search\" color={color} />\n }\n },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Bottom tab bar\n- Tab icons and labels\n- Badge support\n- Active tab highlighting\n\n**Web:**\n- Top or side tabs\n- Can use custom layout component\n- URL-based tab switching\n\n### Use Cases\n- Main app sections\n- Content categories\n- Dashboard views\n- Multi-section interfaces\n\n## Drawer Navigator\n\nSide menu navigation, primarily for desktop/tablet.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'drawer',\n routes: [\n { path: \"dashboard\", type: 'screen', component: DashboardScreen },\n { path: \"users\", type: 'screen', component: UsersScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Slide-out drawer\n- Swipe gesture to open\n- Overlay when open\n\n**Web:**\n- Sidebar navigation\n- Can be persistent or overlay\n- Responsive behavior\n\n### Use Cases\n- Admin panels\n- Desktop applications\n- Content management systems\n- Multi-section apps\n\n## Modal Navigator\n\nOverlay navigation for temporary screens.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/modals\",\n type: 'navigator',\n layout: 'modal',\n routes: [\n { path: \"new-post\", type: 'screen', component: NewPostScreen },\n { path: \"edit-profile\", type: 'screen', component: EditProfileScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Full-screen modal presentation\n- Slide-up animation\n- Close gesture support\n\n**Web:**\n- Overlay modal\n- Background dimming\n- Click-outside to close\n\n### Use Cases\n- Forms and data entry\n- Action confirmations\n- Image viewers\n- Temporary content\n\n## Combining Navigator Types\n\nNavigators can be nested for complex flows:\n\n\\`\\`\\`tsx\nconst appRouter: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n {\n path: \"main\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n { path: \"feed\", type: 'screen', component: FeedScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n ]\n },\n {\n path: \"modals\",\n type: 'navigator',\n layout: 'modal',\n routes: [\n { path: \"create\", type: 'screen', component: CreateScreen },\n ]\n }\n ]\n};\n\\`\\`\\`\n\n## Choosing the Right Navigator\n\n| Navigator | Mobile | Desktop | Use Case |\n|-----------|--------|---------|----------|\n| **Stack** | ✅ Primary | ✅ Primary | Hierarchical navigation |\n| **Tab** | ✅ Primary | ✅ Secondary | Section-based navigation |\n| **Drawer** | ⚠️ Secondary | ✅ Primary | Menu-based navigation |\n| **Modal** | ✅ Common | ✅ Common | Temporary overlays |\n\n## Best Practices\n\n1. **Use stack for most flows** - It's the most universal pattern\n2. **Limit tab count** - 3-5 tabs maximum for mobile\n3. **Reserve drawers for complex apps** - Best on desktop\n4. **Use modals sparingly** - For focused, temporary tasks\n5. **Consider platform** - What works on mobile may not work on web\n6. **Test navigation flow** - Ensure intuitive user experience\n`,\n\n \"idealyst://navigation/custom-layouts\": `# Custom Layouts (Web Only)\n\nOn web, navigators can use custom layout components to add headers, sidebars, and other UI around route content.\n\n## GeneralLayout Component\n\nThe built-in \\`GeneralLayout\\` provides header and sidebar functionality:\n\n### Basic Usage\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\n\n<GeneralLayout\n header={{\n enabled: true,\n content: <Text>My App</Text>,\n }}\n sidebar={{\n enabled: true,\n content: <NavigationMenu />,\n }}\n>\n {children}\n</GeneralLayout>\n\\`\\`\\`\n\n### Header Configuration\n\n\\`\\`\\`tsx\ntype HeaderConfig = {\n enabled: boolean; // Show/hide header\n height?: number; // Header height (default: 64)\n content?: React.ReactNode; // Header content\n style?: ViewStyle; // Custom styles\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\nheader={{\n enabled: true,\n height: 80,\n content: (\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', padding: 16 }}>\n <Text size=\"lg\" weight=\"bold\">Dashboard</Text>\n <UserMenu />\n </View>\n )\n}}\n\\`\\`\\`\n\n### Sidebar Configuration\n\n\\`\\`\\`tsx\ntype SidebarConfig = {\n enabled: boolean; // Show/hide sidebar\n collapsible?: boolean; // Allow collapse/expand\n position?: 'left' | 'right'; // Sidebar position\n initiallyExpanded?: boolean; // Initial state\n expandedWidth?: number; // Width when expanded (default: 240)\n collapsedWidth?: number; // Width when collapsed (default: 64)\n content?: React.ReactNode; // Sidebar content\n style?: ViewStyle; // Custom styles\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\nsidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n initiallyExpanded: true,\n expandedWidth: 280,\n collapsedWidth: 72,\n content: <NavigationSidebar />\n}}\n\\`\\`\\`\n\n## Using Layouts with Navigators\n\n### Stack Navigator with Layout\n\n\\`\\`\\`tsx\nimport { CustomStackLayout } from './layouts/CustomStackLayout';\n\nconst router: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: CustomStackLayout, // Web only!\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n### Tab Navigator with Layout\n\n\\`\\`\\`tsx\nimport { CustomTabLayout } from './layouts/CustomTabLayout';\n\nconst router: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'tab',\n layoutComponent: CustomTabLayout, // Web only!\n routes: [\n { path: \"feed\", type: 'screen', component: FeedScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n ]\n};\n\\`\\`\\`\n\n## Creating Custom Layouts\n\n### Stack Layout Component\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport const CustomStackLayout: React.FC<StackLayoutProps> = ({\n children,\n options,\n routes,\n currentPath\n}) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n content: (\n <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>\n <Text>{options?.headerTitle || 'My App'}</Text>\n {options?.headerRight}\n </View>\n )\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n content: (\n <NavigationMenu routes={routes} currentPath={currentPath} />\n )\n }}\n >\n {children}\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n### Tab Layout Component\n\n\\`\\`\\`tsx\nimport type { TabLayoutProps } from '@idealyst/navigation';\n\nexport const CustomTabLayout: React.FC<TabLayoutProps> = ({\n children,\n routes,\n currentPath\n}) => {\n const navigator = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Custom tab bar */}\n <View style={{ flexDirection: 'row', borderBottom: '1px solid #ccc' }}>\n {routes.map(route => (\n <Pressable\n key={route.path}\n onPress={() => navigator.navigate({ path: route.fullPath, vars: {} })}\n style={{\n padding: 16,\n borderBottom: currentPath === route.fullPath ? '2px solid blue' : 'none'\n }}\n >\n <Text>{route.options?.tabBarLabel || route.path}</Text>\n </Pressable>\n ))}\n </View>\n\n {/* Content */}\n <View style={{ flex: 1 }}>\n {children}\n </View>\n </View>\n );\n};\n\\`\\`\\`\n\n## Layout Props Reference\n\n### StackLayoutProps\n\n\\`\\`\\`tsx\ntype StackLayoutProps = {\n options?: NavigatorOptions; // Navigator options\n routes: RouteWithFullPath[]; // All routes with full paths\n currentPath: string; // Current active path\n children?: React.ReactNode; // Route content\n};\n\\`\\`\\`\n\n### TabLayoutProps\n\n\\`\\`\\`tsx\ntype TabLayoutProps = {\n options?: NavigatorOptions; // Navigator options\n routes: RouteWithFullPath<TabBarScreenOptions>[]; // Tab routes\n currentPath: string; // Current active path\n children?: React.ReactNode; // Route content\n};\n\\`\\`\\`\n\n## Real-World Examples\n\n### Dashboard Layout\n\n\\`\\`\\`tsx\nexport const DashboardLayout: React.FC<StackLayoutProps> = ({\n children,\n routes,\n currentPath\n}) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n height: 72,\n content: (\n <View style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16\n }}>\n <Text size=\"xl\" weight=\"bold\">Dashboard</Text>\n <View style={{ flexDirection: 'row', gap: 16 }}>\n <NotificationBell />\n <UserAvatar />\n </View>\n </View>\n )\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n expandedWidth: 260,\n content: <DashboardSidebar routes={routes} currentPath={currentPath} />\n }}\n >\n {children}\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n### Admin Panel Layout\n\n\\`\\`\\`tsx\nexport const AdminLayout: React.FC<StackLayoutProps> = ({ children }) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n content: <AdminHeader />,\n style: { backgroundColor: '#1a1a1a', color: '#fff' }\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n initiallyExpanded: true,\n content: <AdminNavigationMenu />,\n style: { backgroundColor: '#2a2a2a' }\n }}\n >\n <View style={{ padding: 24 }}>\n {children}\n </View>\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use GeneralLayout as base** - Don't reinvent header/sidebar logic\n2. **Keep layouts simple** - Complex logic belongs in screens\n3. **Make responsive** - Consider different screen sizes\n4. **Theme-aware** - Use theme colors and spacing\n5. **Accessible** - Ensure keyboard and screen reader support\n6. **Performance** - Memoize layout components when possible\n7. **Consistent** - Use same layout for similar sections\n\n## Platform Considerations\n\n- **Web only**: Layout components only apply to web\n- **Mobile**: Uses native navigation components\n- **Conditional rendering**: Check platform if needed\n- **Testing**: Test both platforms separately\n`,\n\n \"idealyst://navigation/use-navigator\": `# useNavigator Hook\n\nThe \\`useNavigator\\` hook provides navigation functionality and route information within your components.\n\n## Basic Usage\n\n\\`\\`\\`tsx\nimport { useNavigator } from '@idealyst/navigation';\n\nfunction MyComponent() {\n const navigator = useNavigator();\n\n return (\n <Button onPress={() => navigator.navigate({ path: '/profile', vars: {} })}>\n Go to Profile\n </Button>\n );\n}\n\\`\\`\\`\n\n## API Reference\n\n### navigator.navigate()\n\nNavigate to a route:\n\n\\`\\`\\`tsx\nnavigator.navigate({\n path: string;\n vars?: Record<string, string>;\n replace?: boolean; // Replace history entry instead of push\n});\n\\`\\`\\`\n\nExamples:\n\\`\\`\\`tsx\n// Simple navigation\nnavigator.navigate({ path: '/home' });\n\n// With path parameters\nnavigator.navigate({\n path: '/user/:id',\n vars: { id: '123' }\n});\n\n// With query parameters\nnavigator.navigate({\n path: '/search',\n vars: { q: 'react', category: 'tutorial' }\n});\n\n// Replace current history entry (no back navigation to current page)\nnavigator.navigate({\n path: '/dashboard',\n replace: true\n});\n\\`\\`\\`\n\n### Replace vs Push Navigation\n\nBy default, navigation pushes a new entry onto the history stack. Use \\`replace: true\\` when you want to replace the current entry instead:\n\n\\`\\`\\`tsx\n// After login, replace login page in history\nnavigator.navigate({ path: '/dashboard', replace: true });\n\n// Redirect without adding to history\nnavigator.navigate({ path: '/new-location', replace: true });\n\\`\\`\\`\n\n**Use cases for replace:**\n- Post-login redirects (user shouldn't go back to login)\n- After form submission redirects\n- URL canonicalization/normalization\n- Redirect from deprecated routes\n\n## useParams Hook\n\nAccess current route path parameters:\n\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\nfunction UserScreen() {\n const params = useParams();\n const userId = params.id; // Path param from /user/:id\n\n return <Text>User ID: {userId}</Text>;\n}\n\\`\\`\\`\n\n## useNavigationState Hook\n\nAccess navigation state passed via the \\`state\\` property:\n\n\\`\\`\\`tsx\nimport { useNavigationState } from '@idealyst/navigation';\n\n// When navigating:\nnavigator.navigate({\n path: '/recording',\n state: { autostart: true, source: 'home' }\n});\n\n// In destination screen:\nfunction RecordingScreen() {\n const { autostart, source } = useNavigationState<{\n autostart?: boolean;\n source?: string;\n }>();\n\n // autostart = true, source = 'home'\n}\n\\`\\`\\`\n\n### Consuming State (Web)\n\nRemove state from URL after reading:\n\n\\`\\`\\`tsx\n// URL: /recording?autostart=true\nconst { autostart } = useNavigationState<{ autostart?: boolean }>({\n consume: ['autostart']\n});\n// autostart = true, URL becomes: /recording (param removed)\n\\`\\`\\`\n\n## useLocation (React Router)\n\nGet the current route path on web:\n\n\\`\\`\\`tsx\nimport { useLocation } from '@idealyst/navigation';\n\nfunction MyComponent() {\n const location = useLocation();\n console.log(location.pathname); // \"/user/123\"\n}\n\\`\\`\\`\n\n### navigator.canGoBack()\n\nCheck if back navigation is available:\n\n\\`\\`\\`tsx\nconst navigator = useNavigator();\n\nif (navigator.canGoBack()) {\n // Show back button\n}\n\\`\\`\\`\n\n**Platform behavior:**\n- **Web**: Returns \\`true\\` if there's a valid parent route in the route hierarchy (e.g., \\`/users/123\\` can go back to \\`/users\\`)\n- **Native**: Uses React Navigation's \\`canGoBack()\\` to check navigation stack\n\n### navigator.goBack()\n\nNavigate back in the route hierarchy:\n\n\\`\\`\\`tsx\n<Button onPress={() => navigator.goBack()}>\n Go Back\n</Button>\n\\`\\`\\`\n\n**Platform behavior:**\n- **Web**: Navigates to the parent route (e.g., \\`/users/123/edit\\` → \\`/users/123\\` → \\`/users\\` → \\`/\\`). Does NOT use browser history - navigates up the route tree.\n- **Native**: Uses React Navigation's \\`goBack()\\` to pop the navigation stack\n\n**Important**: On web, this is NOT browser history back. It navigates to the parent path in the route hierarchy. Use this for \"up\" navigation within your app structure.\n\n## Path Parameters\n\n### Defining Parameters\n\nIn route configuration:\n\\`\\`\\`tsx\n{\n path: \"user/:id\",\n type: 'screen',\n component: UserScreen\n}\n\\`\\`\\`\n\n### Accessing Parameters\n\nIn the screen component:\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\nfunction UserScreen() {\n const params = useParams();\n const userId = params.id;\n\n return <Text>User ID: {userId}</Text>;\n}\n\\`\\`\\`\n\n### Multiple Parameters\n\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\n// Route: \"post/:postId/comment/:commentId\"\n\n// Navigate:\nnavigator.navigate({\n path: '/post/:postId/comment/:commentId',\n vars: { postId: '42', commentId: '7' }\n});\n\n// Access:\nconst params = useParams();\nconst postId = params.postId;\nconst commentId = params.commentId;\n\\`\\`\\`\n\n## Query Parameters\n\n### Passing Query Params\n\n\\`\\`\\`tsx\nnavigator.navigate({\n path: '/search',\n vars: {\n q: 'typescript',\n category: 'tutorial',\n sort: 'recent'\n }\n});\n\n// Results in: /search?q=typescript&category=tutorial&sort=recent\n\\`\\`\\`\n\n### Reading Query Params\n\n\\`\\`\\`tsx\nimport { useNavigationState } from '@idealyst/navigation';\n\nfunction SearchScreen() {\n // Query params are accessed via useNavigationState on web\n const { q, category, sort } = useNavigationState<{\n q?: string;\n category?: string;\n sort?: string;\n }>();\n\n // Use params...\n}\n\\`\\`\\`\n\n## Navigation Patterns\n\n### Programmatic Navigation\n\nNavigate based on conditions:\n\n\\`\\`\\`tsx\nfunction LoginScreen() {\n const navigator = useNavigator();\n\n const handleLogin = async () => {\n const success = await login(credentials);\n\n if (success) {\n navigator.navigate({ path: '/dashboard', vars: {} });\n }\n };\n\n return <Button onPress={handleLogin}>Login</Button>;\n}\n\\`\\`\\`\n\n### Navigation with Data\n\nPass data through navigation:\n\n\\`\\`\\`tsx\n// List screen\n<Button onPress={() => {\n navigator.navigate({\n path: '/product/:id',\n vars: { id: product.id }\n });\n}}>\n View Product\n</Button>\n\n// Detail screen\nfunction ProductScreen() {\n const params = useParams();\n const productId = params.id;\n\n const product = useProduct(productId);\n // Render product...\n}\n\\`\\`\\`\n\n### Conditional Navigation\n\nNavigate based on user state:\n\n\\`\\`\\`tsx\nfunction ProtectedScreen() {\n const navigator = useNavigator();\n const { user } = useAuth();\n\n useEffect(() => {\n if (!user) {\n navigator.navigate({ path: '/login', vars: {} });\n }\n }, [user]);\n\n return user ? <Content /> : null;\n}\n\\`\\`\\`\n\n## Advanced Usage\n\n### Navigation Guards\n\n\\`\\`\\`tsx\nimport { useNavigator, useLocation } from '@idealyst/navigation';\n\nfunction useAuthGuard() {\n const { navigate } = useNavigator();\n const location = useLocation();\n const { isAuthenticated } = useAuth();\n\n useEffect(() => {\n if (!isAuthenticated && location.pathname !== '/login') {\n navigate({ path: '/login' });\n }\n }, [isAuthenticated, location.pathname]);\n}\n\nfunction App() {\n useAuthGuard();\n return <AppContent />;\n}\n\\`\\`\\`\n\n### Deep Linking\n\nHandle deep links:\n\n\\`\\`\\`tsx\nuseEffect(() => {\n const handleDeepLink = (url: string) => {\n // Parse URL and navigate\n const path = parseDeepLink(url);\n navigator.navigate({ path, vars: {} });\n };\n\n // Add deep link listener\n const subscription = Linking.addEventListener('url', ({ url }) => {\n handleDeepLink(url);\n });\n\n return () => subscription.remove();\n}, []);\n\\`\\`\\`\n\n### Navigation History\n\nTrack navigation history:\n\n\\`\\`\\`tsx\nimport { useLocation } from '@idealyst/navigation';\n\nfunction useNavigationHistory() {\n const location = useLocation();\n const [history, setHistory] = useState<string[]>([]);\n\n useEffect(() => {\n setHistory(prev => [...prev, location.pathname]);\n }, [location.pathname]);\n\n return history;\n}\n\\`\\`\\`\n\n## TypeScript Support\n\nType-safe navigation:\n\n\\`\\`\\`tsx\ntype NavigateParams = {\n path: string;\n vars: Record<string, string>;\n};\n\n// Strongly typed vars\ntype UserRouteVars = {\n id: string;\n tab?: 'posts' | 'comments' | 'likes';\n};\n\n// Usage\nnavigator.navigate({\n path: '/user/:id',\n vars: { id: '123', tab: 'posts' } as UserRouteVars\n});\n\\`\\`\\`\n\n## Platform Differences\n\n### React Native\n- \\`canGoBack()\\` checks React Navigation stack\n- \\`goBack()\\` uses native navigation stack\n- Hardware back button supported\n- Gesture-based navigation\n\n### Web\n- \\`canGoBack()\\` checks for valid parent route in hierarchy\n- \\`goBack()\\` navigates to parent route (NOT browser history)\n- Browser back/forward buttons still work for browser history\n- URL updates automatically\n- Bookmarkable URLs\n\n## Best Practices\n\n1. **Always provide vars** - Even if empty: \\`{}\\`\n2. **Type your routes** - Use TypeScript for safety\n3. **Handle errors** - Check if navigation succeeded\n4. **Avoid navigation in render** - Use effects or handlers\n5. **Clean up listeners** - Remove event listeners on unmount\n6. **Test navigation flow** - Verify all paths work\n7. **Use path params for IDs** - Not query params\n8. **Use query params for filters** - Not path params\n\n## Common Patterns\n\n### Back Navigation\n\n\\`\\`\\`tsx\n// Conditionally show back button\nconst { canGoBack, goBack } = useNavigator();\n\n{canGoBack() && (\n <Button\n icon=\"arrow-left\"\n onPress={goBack}\n >\n Back\n </Button>\n)}\n\\`\\`\\`\n\n### Tab Navigation\n\n\\`\\`\\`tsx\nimport { useNavigator, useLocation } from '@idealyst/navigation';\n\nconst tabs = ['feed', 'search', 'profile'];\n\nfunction TabBar() {\n const { navigate } = useNavigator();\n const location = useLocation();\n\n return (\n <View>\n {tabs.map(tab => (\n <Button\n key={tab}\n onPress={() => navigate({ path: \\`/\\${tab}\\` })}\n type={location.pathname === \\`/\\${tab}\\` ? 'contained' : 'outlined'}\n >\n {tab}\n </Button>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n### Modal Navigation\n\n\\`\\`\\`tsx\n<Button onPress={() => {\n navigator.navigate({\n path: '/modal/create-post',\n vars: {}\n });\n}}>\n Create Post\n</Button>\n\n// In modal:\n<Button onPress={() => navigator.goBack()}>\n Close\n</Button>\n\\`\\`\\`\n`,\n\n \"idealyst://navigation/invalid-route-handling\": `# Invalid Route Handling\n\nHandle 404 pages and invalid routes with customizable redirect logic and fallback components.\n\n## Overview\n\nThe navigation system provides two mechanisms for handling invalid routes:\n\n1. **\\`onInvalidRoute\\`** - A handler function that can redirect to a different route\n2. **\\`notFoundComponent\\`** - A fallback component to render when no redirect is specified\n\nThese can be configured at each navigator level and support bubbling up to parent navigators.\n\n## Basic Setup\n\n### Adding a 404 Page\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\n\n// 404 Component receives path and params\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => (\n <Screen>\n <View style={{ alignItems: 'center', padding: 24 }}>\n <Icon name=\"alert-circle\" size={64} color=\"red\" />\n <Text size=\"xl\">Page Not Found</Text>\n <Text color=\"secondary\">The path \"{path}\" doesn't exist.</Text>\n {params && Object.keys(params).length > 0 && (\n <Text size=\"sm\">Params: {JSON.stringify(params)}</Text>\n )}\n </View>\n </Screen>\n);\n\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: NotFoundPage,\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n## NotFoundComponentProps\n\nThe 404 component receives information about the attempted route:\n\n\\`\\`\\`tsx\ntype NotFoundComponentProps = {\n /** The full path that was attempted */\n path: string;\n /** Any route parameters that were parsed from the path */\n params?: Record<string, string>;\n};\n\\`\\`\\`\n\nExample usage:\n\\`\\`\\`tsx\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View style={{ padding: 16, gap: 24 }}>\n <Text size=\"xl\">404 - Page Not Found</Text>\n <Text>Attempted: {path}</Text>\n {params?.id && <Text>User ID: {params.id}</Text>}\n <Button onPress={() => navigate({ path: '/', replace: true })}>\n Go Home\n </Button>\n </View>\n </Screen>\n );\n};\n\\`\\`\\`\n\n## Redirect Handler\n\nUse \\`onInvalidRoute\\` to redirect certain invalid paths:\n\n\\`\\`\\`tsx\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: NotFoundPage,\n onInvalidRoute: (invalidPath) => {\n // Redirect old URLs to new locations\n if (invalidPath.startsWith('/old-blog')) {\n return { path: '/blog', replace: true };\n }\n\n // Redirect legacy paths\n if (invalidPath === '/legacy-dashboard') {\n return { path: '/dashboard', replace: true };\n }\n\n // Return undefined to show notFoundComponent\n return undefined;\n },\n routes: [...]\n};\n\\`\\`\\`\n\n### Handler Return Values\n\nThe \\`onInvalidRoute\\` handler can return:\n\n- **\\`NavigateParams\\`** - Redirect to a different route\n- **\\`undefined\\`** - Show the \\`notFoundComponent\\` (or bubble up)\n\n\\`\\`\\`tsx\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean; // Recommended: true for redirects\n};\n\nonInvalidRoute: (path: string) => NavigateParams | undefined\n\\`\\`\\`\n\n## Scoped Handlers (Nested Navigators)\n\nEach navigator can have its own 404 handling:\n\n\\`\\`\\`tsx\n// Settings-specific 404 page\nconst SettingsNotFound = ({ path }: NotFoundComponentProps) => (\n <Screen>\n <View style={{ alignItems: 'center' }}>\n <Icon name=\"cog-off\" size={48} color=\"orange\" />\n <Text>Settings page not found: {path}</Text>\n </View>\n </Screen>\n);\n\n// Nested settings navigator with its own handler\nconst SettingsNavigator: NavigatorParam = {\n path: \"settings\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: SettingsNotFound,\n onInvalidRoute: (path) => {\n // Redirect deprecated settings paths\n if (path.includes('legacy-setting')) {\n return { path: '/settings/general', replace: true };\n }\n return undefined; // Show SettingsNotFound\n },\n routes: [\n { path: \"\", type: 'screen', component: SettingsHome },\n { path: \"general\", type: 'screen', component: GeneralSettings },\n { path: \"account\", type: 'screen', component: AccountSettings },\n ]\n};\n\n// Root navigator with global 404\nconst AppRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: GlobalNotFound, // Fallback for non-settings routes\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n SettingsNavigator, // Has its own 404 handling\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n## Handler Bubbling\n\nInvalid routes bubble up through the navigator hierarchy:\n\n\\`\\`\\`\nInvalid route detected: /settings/invalid-page\n ↓\nCheck /settings navigator's onInvalidRoute\n ↓\n┌─────────────────────────────────────────┐\n│ Returns NavigateParams? │\n│ YES → Redirect to that route │\n│ NO (undefined) → Check notFoundComponent │\n└─────────────────────────────────────────┘\n ↓\nHas notFoundComponent?\n YES → Render it with { path, params }\n NO → Bubble up to parent navigator\n ↓\nNo parent handles it?\n → console.warn(\"No handler for invalid route\")\n\\`\\`\\`\n\n## Platform Behavior\n\n### Web\n\n- Invalid routes trigger the catch-all route at each navigator level\n- The \\`onInvalidRoute\\` handler is called when the 404 route is rendered\n- If handler returns \\`NavigateParams\\`, navigation uses \\`replace: true\\` by default\n- URL stays at the invalid path when showing \\`notFoundComponent\\`\n\n### Mobile (React Native)\n\n- Invalid routes trigger navigation to a hidden 404 screen\n- The handler is called during the \\`navigate()\\` function\n- If handler returns \\`NavigateParams\\`, redirects to that route\n- If no handler/component, logs a warning\n\n## Complete Example\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\nimport { Screen, View, Text, Button, Icon, Card } from '@idealyst/components';\n\n// Global 404 - detailed error page\nconst GlobalNotFound = ({ path, params }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View style={{ padding: 24, gap: 24, alignItems: 'center', flex: 1, justifyContent: 'center' }}>\n <Icon name=\"alert-circle-outline\" size={64} color=\"red\" />\n <Text size=\"xl\" weight=\"bold\">Page Not Found</Text>\n <Text color=\"secondary\">The page you're looking for doesn't exist.</Text>\n\n <Card style={{ marginTop: 16, padding: 16 }}>\n <Text size=\"sm\" weight=\"semibold\">Attempted path:</Text>\n <Text size=\"sm\" color=\"secondary\">{path}</Text>\n {params && Object.keys(params).length > 0 && (\n <>\n <Text size=\"sm\" weight=\"semibold\" style={{ marginTop: 8 }}>Params:</Text>\n <Text size=\"sm\" color=\"secondary\">{JSON.stringify(params)}</Text>\n </>\n )}\n </Card>\n\n <Button style={{ marginTop: 24 }} onPress={() => navigate({ path: '/', replace: true })}>\n Go Home\n </Button>\n </View>\n </Screen>\n );\n};\n\n// Admin section 404 - simpler style\nconst AdminNotFound = ({ path }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View padding={16} style={{ alignItems: 'center' }}>\n <Icon name=\"shield-off\" size={48} color=\"orange\" />\n <Text size=\"lg\">Admin page not found</Text>\n <Button\n type=\"outlined\"\n size=\"sm\"\n onPress={() => navigate({ path: '/admin', replace: true })}\n >\n Back to Admin\n </Button>\n </View>\n </Screen>\n );\n};\n\n// Admin navigator with redirect logic\nconst AdminNavigator: NavigatorParam = {\n path: \"admin\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: AdminNotFound,\n onInvalidRoute: (path) => {\n // Redirect old admin paths\n if (path.includes('old-users')) {\n return { path: '/admin/users', replace: true };\n }\n if (path.includes('deprecated')) {\n return { path: '/admin', replace: true };\n }\n return undefined; // Show AdminNotFound\n },\n routes: [\n { path: \"\", type: 'screen', component: AdminDashboard },\n { path: \"users\", type: 'screen', component: AdminUsers },\n { path: \"settings\", type: 'screen', component: AdminSettings },\n ]\n};\n\n// Root app router\nconst AppRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'drawer',\n notFoundComponent: GlobalNotFound,\n onInvalidRoute: (path) => {\n // Global redirects\n if (path === '/home') {\n return { path: '/', replace: true };\n }\n return undefined;\n },\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n AdminNavigator,\n { path: \"about\", type: 'screen', component: AboutScreen },\n { path: \"contact\", type: 'screen', component: ContactScreen },\n ]\n};\n\nexport default AppRouter;\n\\`\\`\\`\n\n## Best Practices\n\n1. **Always provide a root notFoundComponent** - Ensures all invalid routes are handled\n2. **Use scoped handlers for sections** - Different 404 styles for different app areas\n3. **Redirect deprecated URLs** - Use \\`onInvalidRoute\\` to maintain URL compatibility\n4. **Include helpful information** - Show the attempted path and suggest alternatives\n5. **Provide navigation options** - Add buttons to go home or back\n6. **Use \\`replace: true\\` for redirects** - Prevents invalid routes in browser history\n7. **Log unhandled routes** - Monitor for missing pages in production\n\n## TypeScript Types\n\n\\`\\`\\`tsx\nimport {\n NavigatorParam,\n NotFoundComponentProps,\n NavigateParams\n} from '@idealyst/navigation';\n\n// NotFoundComponentProps\ntype NotFoundComponentProps = {\n path: string;\n params?: Record<string, string>;\n};\n\n// Handler signature\ntype InvalidRouteHandler = (invalidPath: string) => NavigateParams | undefined;\n\n// NavigateParams (used by handler return and navigate function)\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean;\n};\n\\`\\`\\`\n`,\n\n \"idealyst://navigation/web-mobile-parity\": `# Web/Mobile Navigation Parity\n\nUnderstanding how to achieve the same navigation experience on web that you get for free on mobile.\n\n## The Core Problem\n\nOn **React Native**, you get native navigation UI for free:\n- Stack navigator gives you headers with back buttons\n- Tab navigator gives you a bottom tab bar with icons\n- Drawer navigator gives you a slide-out menu\n\nOn **Web**, you get nothing but URL routing. No headers, no tab bars, no drawers. You must build these yourself using **layout components**.\n\n## The Solution: Layout Components\n\nThe \\`layoutComponent\\` prop on navigators is how you achieve parity. It wraps your route content and provides the navigation UI.\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: MyStackLayout, // <-- This is the key!\n routes: [...]\n}\n\\`\\`\\`\n\n## What Layout Components Receive\n\nEvery layout component receives these props:\n\n\\`\\`\\`tsx\ntype LayoutProps = {\n children: React.ReactNode; // The route content (renders via <Outlet />)\n options?: NavigatorOptions; // headerTitle, headerLeft, headerRight, etc.\n routes: RouteWithFullPath[]; // All child routes with their full paths\n currentPath: string; // Currently active route path\n};\n\\`\\`\\`\n\n**This gives you everything you need to build any navigation UI:**\n- \\`options\\` - What to show in headers\n- \\`routes\\` - What tabs/menu items to render\n- \\`currentPath\\` - Which one is active\n- \\`children\\` - Where to render the screen content\n\n## Stack Navigator Parity\n\n### What Native Gives You\n- Header bar with title\n- Back button (automatic)\n- Right-side actions\n- Smooth transitions\n\n### Web Implementation\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, IconButton, Pressable } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport function StackLayout({ options, currentPath }: StackLayoutProps) {\n const { canGoBack, goBack } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Header - mimics native stack header */}\n {options?.headerShown !== false && (\n <View style={{\n height: 56,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n borderBottomWidth: 1,\n borderBottomColor: '#e0e0e0',\n backgroundColor: '#fff',\n }}>\n {/* Back button - like native */}\n {options?.headerBackVisible !== false && canGoBack() && (\n <IconButton\n icon=\"arrow-left\"\n onPress={goBack}\n style={{ marginRight: 8 }}\n />\n )}\n\n {/* Left slot */}\n {options?.headerLeft && (\n <View style={{ marginRight: 16 }}>\n {typeof options.headerLeft === 'function'\n ? options.headerLeft({})\n : options.headerLeft}\n </View>\n )}\n\n {/* Title - centered or left-aligned */}\n <View style={{ flex: 1 }}>\n {typeof options?.headerTitle === 'string' ? (\n <Text variant=\"title\">{options.headerTitle}</Text>\n ) : (\n options?.headerTitle\n )}\n </View>\n\n {/* Right slot */}\n {options?.headerRight && (\n <View>\n {typeof options.headerRight === 'function'\n ? options.headerRight({})\n : options.headerRight}\n </View>\n )}\n </View>\n )}\n\n {/* Content area */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Tab Navigator Parity\n\n### What Native Gives You\n- Bottom tab bar\n- Icons for each tab\n- Labels\n- Badge counts\n- Active state highlighting\n\n### Web Implementation\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon, Badge } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { TabLayoutProps } from '@idealyst/navigation';\n\nexport function TabLayout({ routes, currentPath }: TabLayoutProps) {\n const { navigate } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Content area */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n\n {/* Bottom tab bar - mimics native */}\n <View style={{\n height: 56,\n flexDirection: 'row',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n backgroundColor: '#fff',\n }}>\n {routes.map((route) => {\n const isActive = currentPath === route.fullPath;\n const options = route.options;\n\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n }}\n >\n {/* Icon with optional badge */}\n <View style={{ position: 'relative' }}>\n {options?.tabBarIcon?.({\n focused: isActive,\n color: isActive ? '#007AFF' : '#8E8E93',\n size: 24,\n })}\n {options?.tabBarBadge && (\n <Badge\n count={options.tabBarBadge}\n style={{ position: 'absolute', top: -4, right: -8 }}\n />\n )}\n </View>\n\n {/* Label */}\n {options?.tabBarLabel && (\n <Text\n size=\"xs\"\n style={{\n marginTop: 4,\n color: isActive ? '#007AFF' : '#8E8E93',\n }}\n >\n {options.tabBarLabel}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Drawer Navigator Parity\n\n### What Native Gives You\n- Slide-out drawer from edge\n- Overlay when open\n- Gesture to open/close\n- Menu items\n\n### Web Implementation\n\nOn web, drawers are typically persistent sidebars. Here's how to build both:\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport function DrawerLayout({ routes, currentPath, options }: StackLayoutProps) {\n const { navigate } = useNavigator();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n {/* Sidebar - always visible on web */}\n <View style={{\n width: isCollapsed ? 64 : 240,\n borderRightWidth: 1,\n borderRightColor: '#e0e0e0',\n backgroundColor: '#f8f8f8',\n transition: 'width 0.2s',\n }}>\n {/* Logo/Header */}\n <View style={{ height: 56, justifyContent: 'center', paddingHorizontal: 16 }}>\n {!isCollapsed && <Text variant=\"title\">My App</Text>}\n </View>\n\n {/* Menu Items */}\n {routes.map((route) => {\n const isActive = currentPath.startsWith(route.fullPath);\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 12,\n backgroundColor: isActive ? 'rgba(0,0,0,0.08)' : 'transparent',\n }}\n >\n <Icon\n name={route.options?.icon || 'circle'}\n size={24}\n color={isActive ? '#007AFF' : '#666'}\n />\n {!isCollapsed && (\n <Text style={{ marginLeft: 12, color: isActive ? '#007AFF' : '#333' }}>\n {route.options?.title || route.path}\n </Text>\n )}\n </Pressable>\n );\n })}\n\n {/* Collapse toggle */}\n <Pressable\n onPress={() => setIsCollapsed(!isCollapsed)}\n style={{ padding: 12, marginTop: 'auto' }}\n >\n <Icon name={isCollapsed ? 'chevron-right' : 'chevron-left'} size={24} />\n </Pressable>\n </View>\n\n {/* Content */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Using GeneralLayout Helper\n\nThe \\`GeneralLayout\\` component simplifies building layouts:\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\n\nexport function AppLayout({ options, routes, currentPath, children }: StackLayoutProps) {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n height: 56,\n content: (\n <View style={{ flexDirection: 'row', alignItems: 'center', flex: 1 }}>\n <Text variant=\"title\">{options?.headerTitle || 'App'}</Text>\n <View style={{ marginLeft: 'auto' }}>{options?.headerRight}</View>\n </View>\n ),\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n expandedWidth: 240,\n collapsedWidth: 64,\n content: <SidebarMenu routes={routes} currentPath={currentPath} />,\n }}\n >\n {children}\n </GeneralLayout>\n );\n}\n\\`\\`\\`\n\n## Putting It All Together\n\nHere's a complete router setup with web layouts:\n\n\\`\\`\\`tsx\nimport { NavigatorParam } from '@idealyst/navigation';\nimport { StackLayout } from './layouts/StackLayout';\nimport { TabLayout } from './layouts/TabLayout';\n\nconst appRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: StackLayout, // Web header\n options: {\n headerTitle: \"My App\",\n headerRight: <UserMenu />,\n },\n routes: [\n {\n path: \"main\",\n type: 'navigator',\n layout: 'tab',\n layoutComponent: TabLayout, // Web tab bar\n routes: [\n {\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ color }) => <Icon name=\"home\" color={color} />,\n },\n },\n {\n path: \"search\",\n type: 'screen',\n component: SearchScreen,\n options: {\n tabBarLabel: \"Search\",\n tabBarIcon: ({ color }) => <Icon name=\"magnify\" color={color} />,\n },\n },\n ],\n },\n {\n path: \"settings\",\n type: 'screen',\n component: SettingsScreen,\n },\n ],\n};\n\\`\\`\\`\n\n## Key Insights\n\n1. **layoutComponent is web-only** - Native ignores it and uses native navigators\n2. **Same route config, different UI** - Your routes stay the same, layouts differ\n3. **Options are your data source** - headerTitle, tabBarIcon, etc. drive your layout\n4. **routes array is navigation menu** - Use it to build sidebars, tab bars, menus\n5. **currentPath enables active states** - Compare to highlight current item\n6. **Outlet renders children** - From react-router-dom, this is where screen content goes\n\n## Common Patterns\n\n### Responsive Layout\n\\`\\`\\`tsx\nfunction ResponsiveLayout(props: StackLayoutProps) {\n const { width } = useWindowDimensions();\n const isMobile = width < 768;\n\n // Tabs on mobile, drawer on desktop\n return isMobile\n ? <TabLayout {...props} />\n : <DrawerLayout {...props} />;\n}\n\\`\\`\\`\n\n### Nested Headers\n\\`\\`\\`tsx\n// Parent navigator has app header\n// Child navigator has section header\n{\n path: \"/\",\n layoutComponent: AppHeaderLayout,\n routes: [{\n path: \"admin\",\n layoutComponent: AdminSectionHeader, // Adds another header\n routes: [...]\n }]\n}\n\\`\\`\\`\n\n### Hiding Navigation\n\\`\\`\\`tsx\nfunction ConditionalLayout(props: StackLayoutProps) {\n // Hide navigation on certain routes\n if (props.currentPath.includes('/fullscreen')) {\n return <Outlet />; // No chrome\n }\n return <FullLayout {...props} />;\n}\n\\`\\`\\`\n\n## Summary\n\n| Native Gets | Web Needs |\n|-------------|-----------|\n| Stack header | \\`layoutComponent\\` with header UI |\n| Tab bar | \\`layoutComponent\\` with tab buttons |\n| Drawer | \\`layoutComponent\\` with sidebar |\n| Back button | \\`canGoBack()\\` + \\`goBack()\\` |\n| Active states | Compare \\`currentPath\\` to \\`route.fullPath\\` |\n| Screen options | Access via \\`options\\` and \\`route.options\\` |\n\nThe key to web/mobile parity is understanding that **layout components give web everything native navigators provide automatically**.\n`,\n};\n","export const translateGuides: Record<string, string> = {\n \"idealyst://translate/overview\": `# @idealyst/translate Overview\n\nCross-platform internationalization for the Idealyst Framework. Wraps \\`react-i18next\\` with a unified API and includes a Babel plugin for static translation key analysis.\n\n## Core Features\n\n- **Unified API** - Single API for React and React Native\n- **Babel Plugin** - Static extraction of translation keys at build time\n- **Missing Translation Detection** - Automatically detect keys missing translations\n- **Unused Translation Detection** - Find translations not used in code\n- **JSON Report** - Generate detailed reports for CI/CD integration\n- **Namespace Support** - Organize translations with nested namespaces\n- **Pluralization** - Full i18next pluralization support\n- **Interpolation** - Variable interpolation in translations\n- **Rich Text** - Component interpolation with the Trans component\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/translate react-i18next i18next\n\\`\\`\\`\n\n## Quick Start\n\n### 1. Create Translation Files\n\n\\`\\`\\`\nlocales/\n├── en/\n│ └── common.json\n└── es/\n └── common.json\n\\`\\`\\`\n\n**locales/en/common.json**\n\\`\\`\\`json\n{\n \"welcome\": {\n \"title\": \"Welcome to Our App\",\n \"greeting\": \"Hello, {{name}}!\"\n },\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\"\n }\n}\n\\`\\`\\`\n\n### 2. Set Up the Provider\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <MyApp />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n### 3. Use Translations\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction MyComponent() {\n const { t } = useTranslation('common');\n\n return (\n <div>\n <h1>{t('welcome.title')}</h1>\n <p>{t('welcome.greeting', { name: 'John' })}</p>\n <button>{t('buttons.submit')}</button>\n </div>\n );\n}\n\\`\\`\\`\n\n## Key Concepts\n\n### Key Formats\nThe package supports two key formats:\n\n\\`\\`\\`tsx\n// Namespace:key format (i18next standard)\nt('auth:login.title')\n\n// Namespace.key format (first segment is namespace)\nt('auth.login.title')\n\\`\\`\\`\n\n### Namespace Organization\nOrganize translations by domain:\n- \\`common.json\\` - Shared UI strings\n- \\`auth.json\\` - Authentication strings\n- \\`errors.json\\` - Error messages\n- \\`forms.json\\` - Form labels and validation\n`,\n\n \"idealyst://translate/runtime-api\": `# Runtime API Reference\n\nComplete reference for the @idealyst/translate runtime API.\n\n## TranslateProvider\n\nWrap your app with the provider to enable translations:\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\n\n<TranslateProvider\n config={{\n defaultLanguage: 'en',\n languages: ['en', 'es', 'fr'],\n resources: {\n en: { common: enCommon, auth: enAuth },\n es: { common: esCommon, auth: esAuth },\n },\n defaultNamespace: 'common',\n fallbackLanguage: 'en',\n debug: false,\n }}\n onInitialized={(i18n) => console.log('i18n ready')}\n onLanguageChanged={(lang) => console.log('Language:', lang)}\n>\n <App />\n</TranslateProvider>\n\\`\\`\\`\n\n### TranslateConfig Options\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| \\`defaultLanguage\\` | string | Yes | Default language code |\n| \\`languages\\` | string[] | Yes | Supported language codes |\n| \\`resources\\` | object | No | Pre-loaded translation resources |\n| \\`defaultNamespace\\` | string | No | Default namespace (default: 'translation') |\n| \\`fallbackLanguage\\` | string | No | Fallback when key missing |\n| \\`debug\\` | boolean | No | Enable debug logging |\n\n## useTranslation Hook\n\nThe main hook for accessing translations:\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction Component() {\n const { t, language, languages, ready, i18n } = useTranslation('common');\n\n // Simple translation\n const title = t('welcome.title');\n\n // With interpolation\n const greeting = t('welcome.greeting', { name: 'World' });\n\n // With default value\n const fallback = t('missing.key', { defaultValue: 'Fallback text' });\n\n // With pluralization\n const items = t('items', { count: 5 });\n\n // With context\n const gendered = t('liked', { context: 'male' });\n\n return <div>{title}</div>;\n}\n\\`\\`\\`\n\n### Return Values\n\n| Property | Type | Description |\n|----------|------|-------------|\n| \\`t\\` | function | Translation function |\n| \\`language\\` | string | Current language code |\n| \\`languages\\` | string[] | All available languages |\n| \\`ready\\` | boolean | Whether translations are loaded |\n| \\`i18n\\` | i18n | i18next instance for advanced usage |\n\n### Translation Options\n\n\\`\\`\\`tsx\nt('key', {\n // Default value if key not found\n defaultValue: 'Fallback',\n\n // Interpolation values\n name: 'John',\n count: 5,\n\n // Pluralization count\n count: 3,\n\n // Context for contextual translations\n context: 'male',\n});\n\\`\\`\\`\n\n## useLanguage Hook\n\nFor language management:\n\n\\`\\`\\`tsx\nimport { useLanguage } from '@idealyst/translate';\n\nfunction LanguageControls() {\n const {\n language, // Current: 'en'\n languages, // Available: ['en', 'es', 'fr']\n setLanguage, // Change language\n isSupported, // Check availability\n getDisplayName, // Get 'English', 'Español'\n } = useLanguage();\n\n return (\n <select value={language} onChange={(e) => setLanguage(e.target.value)}>\n {languages.map((lang) => (\n <option key={lang} value={lang}>\n {getDisplayName(lang)}\n </option>\n ))}\n </select>\n );\n}\n\\`\\`\\`\n\n## Trans Component\n\nFor rich text with embedded components:\n\n\\`\\`\\`tsx\nimport { Trans } from '@idealyst/translate';\n\nfunction RichText() {\n return (\n <Trans\n i18nKey=\"common.richText\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n bold: <strong />,\n }}\n values={{ name: 'User' }}\n />\n );\n}\n\n// Translation:\n// \"richText\": \"Read our <terms>Terms</terms> and <privacy>Privacy Policy</privacy>\"\n//\n// Renders:\n// Read our <a href=\"/terms\">Terms</a> and <a href=\"/privacy\">Privacy Policy</a>\n\\`\\`\\`\n\n### Trans Props\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| \\`i18nKey\\` | string | Yes | Translation key |\n| \\`ns\\` | string | No | Namespace |\n| \\`components\\` | object | No | Component interpolations |\n| \\`values\\` | object | No | Value interpolations |\n| \\`count\\` | number | No | Pluralization count |\n`,\n\n \"idealyst://translate/babel-plugin\": `# Babel Plugin Reference\n\nThe Babel plugin extracts translation keys at build time and generates reports of missing/unused translations.\n\n## Installation\n\nThe plugin is included with @idealyst/translate. Just configure it in your Babel config.\n\n## Configuration\n\n### babel.config.js\n\n\\`\\`\\`javascript\nmodule.exports = {\n presets: ['@babel/preset-react', '@babel/preset-typescript'],\n plugins: [\n ['@idealyst/translate/plugin', {\n // Required: paths to translation JSON files\n translationFiles: ['./locales/**/*.json'],\n\n // Optional: output path for the report\n reportPath: '.idealyst/translations-report.json',\n\n // Optional: default namespace\n defaultNamespace: 'common',\n\n // Optional: emit console warnings\n emitWarnings: true,\n\n // Optional: fail build on missing translations\n failOnMissing: false,\n\n // Optional: verbose logging\n verbose: false,\n }],\n ],\n};\n\\`\\`\\`\n\n### Vite Configuration\n\n\\`\\`\\`typescript\n// vite.config.ts\nimport { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [\n react({\n babel: {\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n }],\n ],\n },\n }),\n ],\n});\n\\`\\`\\`\n\n### React Native Configuration\n\n\\`\\`\\`javascript\n// babel.config.js\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n emitWarnings: true,\n }],\n ],\n};\n\\`\\`\\`\n\n## Plugin Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| \\`translationFiles\\` | string[] | Required | Glob patterns for translation files |\n| \\`reportPath\\` | string | '.idealyst/translations-report.json' | Output path for report |\n| \\`languages\\` | string[] | Auto-detected | Languages to check |\n| \\`defaultNamespace\\` | string | 'translation' | Default namespace |\n| \\`failOnMissing\\` | boolean | false | Fail build if missing |\n| \\`emitWarnings\\` | boolean | true | Console warnings |\n| \\`verbose\\` | boolean | false | Verbose logging |\n\n## What Gets Extracted\n\nThe plugin statically analyzes your code for:\n\n\\`\\`\\`tsx\n// t() function calls\nt('common.key')\nt('namespace:key')\nt('key', { defaultValue: 'Default' })\n\n// i18n.t() method calls\ni18n.t('common.key')\n\n// Trans component\n<Trans i18nKey=\"common.richText\" />\n<Trans i18nKey={\"common.richText\"} />\n\n// Dynamic keys (tracked but marked as dynamic)\nconst key = \\`common.\\${type}\\`;\nt(key); // Marked as isDynamic: true\n\\`\\`\\`\n\n## Report Structure\n\nThe plugin generates a JSON report:\n\n\\`\\`\\`json\n{\n \"timestamp\": \"2026-01-08T12:00:00.000Z\",\n \"totalKeys\": 45,\n \"dynamicKeys\": [\n {\n \"key\": \"<dynamic>\",\n \"file\": \"src/DynamicComponent.tsx\",\n \"line\": 15,\n \"isDynamic\": true\n }\n ],\n \"extractedKeys\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"localKey\": \"buttons.submit\",\n \"file\": \"src/Form.tsx\",\n \"line\": 42,\n \"column\": 12,\n \"defaultValue\": \"Submit\",\n \"isDynamic\": false\n }\n ],\n \"languages\": [\"en\", \"es\", \"fr\"],\n \"missing\": {\n \"en\": [],\n \"es\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"usedIn\": [\n { \"file\": \"src/Form.tsx\", \"line\": 42, \"column\": 12 }\n ],\n \"defaultValue\": \"Submit\"\n }\n ]\n },\n \"unused\": {\n \"en\": [\"common.legacy.oldFeature\"]\n },\n \"summary\": {\n \"totalMissing\": 1,\n \"totalUnused\": 1,\n \"coveragePercent\": {\n \"en\": 100,\n \"es\": 98,\n \"fr\": 100\n }\n }\n}\n\\`\\`\\`\n\n## CI/CD Integration\n\n### GitHub Actions\n\n\\`\\`\\`yaml\nname: Translation Check\n\non: [push, pull_request]\n\njobs:\n check-translations:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - uses: actions/setup-node@v3\n with:\n node-version: '20'\n - run: yarn install\n - run: yarn build\n - name: Check missing translations\n run: |\n MISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n if [ \"$MISSING\" -gt 0 ]; then\n echo \"Missing translations: $MISSING\"\n jq '.missing' .idealyst/translations-report.json\n exit 1\n fi\n\\`\\`\\`\n\n### Shell Script\n\n\\`\\`\\`bash\n#!/bin/bash\nyarn build\n\nMISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n\nif [ \"$MISSING\" -gt 0 ]; then\n echo \"ERROR: $MISSING missing translation(s)\"\n jq -r '.missing | to_entries[] | select(.value | length > 0) | \"\\\\(.key): \\\\(.value | length) missing\"' \\\\\n .idealyst/translations-report.json\n exit 1\nfi\n\necho \"All translations present!\"\n\\`\\`\\`\n`,\n\n \"idealyst://translate/translation-files\": `# Translation File Format\n\nGuide to organizing and formatting translation files for @idealyst/translate.\n\n## Directory Structure\n\nOrganize translations by language and namespace:\n\n\\`\\`\\`\nlocales/\n├── en/\n│ ├── common.json # Common UI strings\n│ ├── auth.json # Authentication strings\n│ ├── errors.json # Error messages\n│ └── forms.json # Form labels\n├── es/\n│ ├── common.json\n│ ├── auth.json\n│ ├── errors.json\n│ └── forms.json\n└── fr/\n ├── common.json\n ├── auth.json\n ├── errors.json\n └── forms.json\n\\`\\`\\`\n\n## JSON Format\n\n### Basic Structure\n\n\\`\\`\\`json\n{\n \"simple\": \"Simple text\",\n\n \"nested\": {\n \"keys\": {\n \"work\": \"Like this\"\n }\n }\n}\n\\`\\`\\`\n\n### Interpolation\n\nUse \\`{{variable}}\\` for dynamic values:\n\n\\`\\`\\`json\n{\n \"greeting\": \"Hello, {{name}}!\",\n \"welcome\": \"Welcome back, {{user}}. You have {{count}} messages.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('greeting', { name: 'John' }) // \"Hello, John!\"\nt('welcome', { user: 'Alice', count: 5 }) // \"Welcome back, Alice. You have 5 messages.\"\n\\`\\`\\`\n\n### Pluralization\n\nAdd \\`_plural\\` suffix for plural forms:\n\n\\`\\`\\`json\n{\n \"item\": \"{{count}} item\",\n \"item_plural\": \"{{count}} items\",\n\n \"message\": \"You have {{count}} new message\",\n \"message_plural\": \"You have {{count}} new messages\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('item', { count: 1 }) // \"1 item\"\nt('item', { count: 5 }) // \"5 items\"\n\\`\\`\\`\n\n### Context\n\nAdd \\`_context\\` suffix for contextual variations:\n\n\\`\\`\\`json\n{\n \"friend\": \"A friend\",\n \"friend_male\": \"A boyfriend\",\n \"friend_female\": \"A girlfriend\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('friend') // \"A friend\"\nt('friend', { context: 'male' }) // \"A boyfriend\"\nt('friend', { context: 'female' }) // \"A girlfriend\"\n\\`\\`\\`\n\n### Rich Text (Trans Component)\n\nUse HTML-like tags for component interpolation:\n\n\\`\\`\\`json\n{\n \"terms\": \"By signing up, you agree to our <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>.\",\n \"welcome\": \"Welcome, <bold>{{name}}</bold>! Click <link>here</link> to continue.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\n<Trans\n i18nKey=\"common.terms\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n }}\n/>\n\\`\\`\\`\n\n## Namespace Organization\n\n### common.json - Shared UI\n\\`\\`\\`json\n{\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\",\n \"save\": \"Save\",\n \"delete\": \"Delete\",\n \"edit\": \"Edit\"\n },\n \"labels\": {\n \"loading\": \"Loading...\",\n \"danger\": \"An error occurred\",\n \"success\": \"Success!\"\n }\n}\n\\`\\`\\`\n\n### auth.json - Authentication\n\\`\\`\\`json\n{\n \"login\": {\n \"title\": \"Sign In\",\n \"email\": \"Email\",\n \"password\": \"Password\",\n \"submit\": \"Sign In\",\n \"forgotPassword\": \"Forgot password?\"\n },\n \"register\": {\n \"title\": \"Create Account\",\n \"submit\": \"Sign Up\"\n },\n \"errors\": {\n \"invalidCredentials\": \"Invalid email or password\",\n \"emailTaken\": \"Email is already registered\"\n }\n}\n\\`\\`\\`\n\n### errors.json - Error Messages\n\\`\\`\\`json\n{\n \"network\": {\n \"offline\": \"You are offline. Please check your connection.\",\n \"timeout\": \"Request timed out. Please try again.\"\n },\n \"validation\": {\n \"required\": \"This field is required\",\n \"email\": \"Please enter a valid email\",\n \"minLength\": \"Must be at least {{min}} characters\"\n },\n \"http\": {\n \"400\": \"Bad request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not found\",\n \"500\": \"Server error\"\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n### 1. Use Descriptive Keys\n\\`\\`\\`json\n// Good\n{\n \"userProfile\": {\n \"editButton\": \"Edit Profile\",\n \"saveSuccess\": \"Profile saved successfully\"\n }\n}\n\n// Avoid\n{\n \"btn1\": \"Edit Profile\",\n \"msg1\": \"Profile saved successfully\"\n}\n\\`\\`\\`\n\n### 2. Group Related Translations\n\\`\\`\\`json\n{\n \"checkout\": {\n \"title\": \"Checkout\",\n \"steps\": {\n \"shipping\": \"Shipping\",\n \"payment\": \"Payment\",\n \"review\": \"Review\"\n },\n \"buttons\": {\n \"next\": \"Continue\",\n \"back\": \"Go Back\",\n \"placeOrder\": \"Place Order\"\n }\n }\n}\n\\`\\`\\`\n\n### 3. Keep Keys Consistent Across Languages\nAll language files should have the same key structure:\n\n\\`\\`\\`json\n// en/common.json\n{ \"greeting\": \"Hello\" }\n\n// es/common.json\n{ \"greeting\": \"Hola\" }\n\n// fr/common.json\n{ \"greeting\": \"Bonjour\" }\n\\`\\`\\`\n\n### 4. Add Comments with Default Values\nThe Babel plugin extracts \\`defaultValue\\` for documentation:\n\n\\`\\`\\`tsx\nt('newFeature.title', { defaultValue: 'New Feature' })\n\\`\\`\\`\n\nThis appears in the report and helps translators understand context.\n`,\n\n \"idealyst://translate/examples\": `# Translation Examples\n\nComplete code examples for common @idealyst/translate patterns.\n\n## Basic App Setup\n\n\\`\\`\\`tsx\n// App.tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <Navigation />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n## Component with Translations\n\n\\`\\`\\`tsx\n// components/WelcomeScreen.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\nexport function WelcomeScreen() {\n const { t } = useTranslation('common');\n\n return (\n <View>\n <Text variant=\"h1\">{t('welcome.title')}</Text>\n <Text>{t('welcome.subtitle')}</Text>\n <Button onPress={() => {}}>\n {t('buttons.getStarted')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Language Switcher Component\n\n\\`\\`\\`tsx\n// components/LanguageSwitcher.tsx\nimport { Select } from '@idealyst/components';\nimport { useLanguage } from '@idealyst/translate';\n\nexport function LanguageSwitcher() {\n const { language, languages, setLanguage, getDisplayName } = useLanguage();\n\n const options = languages.map((lang) => ({\n value: lang,\n label: getDisplayName(lang),\n }));\n\n return (\n <Select\n value={language}\n options={options}\n onChange={(value) => setLanguage(value)}\n label=\"Language\"\n />\n );\n}\n\\`\\`\\`\n\n## Form with Validation Messages\n\n\\`\\`\\`tsx\n// components/LoginForm.tsx\nimport { View, Input, Button, Text } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\nimport { useState } from 'react';\n\nexport function LoginForm() {\n const { t } = useTranslation('auth');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async () => {\n try {\n // ... login logic\n } catch (e) {\n setError(t('errors.invalidCredentials'));\n }\n };\n\n return (\n <View>\n <Text variant=\"h2\">{t('login.title')}</Text>\n\n <Input\n label={t('login.email')}\n placeholder={t('login.emailPlaceholder')}\n keyboardType=\"email-address\"\n />\n\n <Input\n label={t('login.password')}\n placeholder={t('login.passwordPlaceholder')}\n secureTextEntry\n />\n\n {error && <Text intent=\"danger\">{error}</Text>}\n\n <Button onPress={handleSubmit}>\n {t('login.submit')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Pluralization Example\n\n\\`\\`\\`tsx\n// components/NotificationBadge.tsx\nimport { Badge } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\ninterface Props {\n count: number;\n}\n\nexport function NotificationBadge({ count }: Props) {\n const { t } = useTranslation('common');\n\n if (count === 0) return null;\n\n return (\n <Badge intent=\"primary\">\n {t('notifications.count', { count })}\n </Badge>\n );\n}\n\n// Translation file:\n// {\n// \"notifications\": {\n// \"count\": \"{{count}} notification\",\n// \"count_plural\": \"{{count}} notifications\"\n// }\n// }\n\\`\\`\\`\n\n## Rich Text with Trans Component\n\n\\`\\`\\`tsx\n// components/TermsAgreement.tsx\nimport { View, Text, Checkbox } from '@idealyst/components';\nimport { Trans, useTranslation } from '@idealyst/translate';\nimport { Link } from '@idealyst/navigation';\nimport { useState } from 'react';\n\nexport function TermsAgreement() {\n const { t } = useTranslation('auth');\n const [agreed, setAgreed] = useState(false);\n\n return (\n <View>\n <Checkbox\n checked={agreed}\n onChange={setAgreed}\n label={\n <Trans\n i18nKey=\"auth.termsAgreement\"\n components={{\n terms: <Link to=\"/terms\" />,\n privacy: <Link to=\"/privacy\" />,\n }}\n />\n }\n />\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"termsAgreement\": \"I agree to the <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>\"\n// }\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\n// hooks/usePersistedLanguage.ts\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst LANGUAGE_KEY = '@app/language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n AsyncStorage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n AsyncStorage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## Multiple Namespaces\n\n\\`\\`\\`tsx\n// components/UserProfile.tsx\nimport { useTranslation } from '@idealyst/translate';\n\nexport function UserProfile() {\n // Load multiple namespaces\n const { t } = useTranslation(['common', 'user']);\n\n return (\n <View>\n {/* Use namespace prefix */}\n <Text variant=\"h1\">{t('user:profile.title')}</Text>\n <Button>{t('common:buttons.edit')}</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Date and Number Formatting\n\n\\`\\`\\`tsx\n// components/OrderSummary.tsx\nimport { View, Text } from '@idealyst/components';\nimport { useTranslation, useLanguage } from '@idealyst/translate';\n\ninterface Props {\n total: number;\n orderDate: Date;\n}\n\nexport function OrderSummary({ total, orderDate }: Props) {\n const { t } = useTranslation('orders');\n const { language } = useLanguage();\n\n // Format based on current language\n const formattedTotal = new Intl.NumberFormat(language, {\n style: 'currency',\n currency: 'USD',\n }).format(total);\n\n const formattedDate = new Intl.DateTimeFormat(language, {\n dateStyle: 'long',\n }).format(orderDate);\n\n return (\n <View>\n <Text>{t('summary.total', { amount: formattedTotal })}</Text>\n <Text>{t('summary.date', { date: formattedDate })}</Text>\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"summary\": {\n// \"total\": \"Total: {{amount}}\",\n// \"date\": \"Order placed on {{date}}\"\n// }\n// }\n\\`\\`\\`\n`,\n};\n","export const storageGuides: Record<string, string> = {\n \"idealyst://storage/overview\": `# @idealyst/storage Overview\n\nCross-platform storage solution for React and React Native applications. Provides a consistent async API for persistent data storage.\n\n## Features\n\n- **Cross-Platform** - Works seamlessly on React Native and Web\n- **Simple API** - Async/await based with consistent interface\n- **React Native** - Uses MMKV for high-performance storage\n- **Web** - Uses localStorage with proper error handling\n- **TypeScript** - Full type safety and IntelliSense support\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/storage\n\n# React Native also needs:\nyarn add react-native-mmkv\ncd ios && pod install\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Store string data\nawait storage.setItem('token', 'abc123');\n\n// Store objects (use JSON.stringify)\nawait storage.setItem('user', JSON.stringify({ name: 'John', id: 123 }));\n\n// Retrieve string data\nconst token = await storage.getItem('token');\n\n// Retrieve and parse objects\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) : null;\n\n// Remove data\nawait storage.removeItem('token');\n\n// Clear all data\nawait storage.clear();\n\n// Get all keys\nconst keys = await storage.getAllKeys();\n\\`\\`\\`\n\n## Import Options\n\n\\`\\`\\`tsx\n// Named import (recommended)\nimport { storage } from '@idealyst/storage';\n\n// Default import\nimport storage from '@idealyst/storage';\n\\`\\`\\`\n\n## Platform Details\n\n- **React Native**: Uses \\`react-native-mmkv\\` for high-performance storage\n- **Web**: Uses browser \\`localStorage\\`\n`,\n\n \"idealyst://storage/api\": `# Storage API Reference\n\nComplete API reference for @idealyst/storage.\n\n## setItem\n\nStore a string value with the given key.\n\n\\`\\`\\`tsx\nawait storage.setItem(key: string, value: string): Promise<void>\n\n// Examples\nawait storage.setItem('token', 'abc123');\nawait storage.setItem('userId', '42');\n\n// For objects, use JSON.stringify\nawait storage.setItem('user', JSON.stringify({ name: 'John', age: 30 }));\nawait storage.setItem('tags', JSON.stringify(['react', 'native']));\nawait storage.setItem('settings', JSON.stringify({ theme: 'dark', notifications: true }));\n\\`\\`\\`\n\n## getItem\n\nRetrieve a string value by key. Returns \\`null\\` if the key doesn't exist.\n\n\\`\\`\\`tsx\nawait storage.getItem(key: string): Promise<string | null>\n\n// Examples\nconst token = await storage.getItem('token');\nconst userId = await storage.getItem('userId');\n\n// For objects, parse the JSON\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) as User : null;\n\nconst tagsData = await storage.getItem('tags');\nconst tags = tagsData ? JSON.parse(tagsData) as string[] : [];\n\nif (user) {\n console.log(user.name);\n}\n\\`\\`\\`\n\n## removeItem\n\nRemove a specific item from storage.\n\n\\`\\`\\`tsx\nawait storage.removeItem(key: string): Promise<void>\n\n// Examples\nawait storage.removeItem('user');\nawait storage.removeItem('temporaryData');\n\\`\\`\\`\n\n## clear\n\nRemove all items from storage.\n\n\\`\\`\\`tsx\nawait storage.clear(): Promise<void>\n\\`\\`\\`\n\n## getAllKeys\n\nReturns all keys currently in storage.\n\n\\`\\`\\`tsx\nawait storage.getAllKeys(): Promise<string[]>\n\n// Example\nconst keys = await storage.getAllKeys();\nconsole.log('Stored keys:', keys); // ['user', 'settings', 'token']\n\\`\\`\\`\n\n## Helper Pattern for Typed Storage\n\nCreate a typed wrapper for cleaner code:\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Helper functions for typed storage\nasync function setObject<T>(key: string, value: T): Promise<void> {\n await storage.setItem(key, JSON.stringify(value));\n}\n\nasync function getObject<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(key);\n return data ? JSON.parse(data) as T : null;\n}\n\n// Usage\ninterface User {\n id: number;\n name: string;\n}\n\nawait setObject<User>('user', { id: 1, name: 'John' });\nconst user = await getObject<User>('user');\n\\`\\`\\`\n`,\n\n \"idealyst://storage/examples\": `# Storage Examples\n\nComplete code examples for common @idealyst/storage patterns.\n\n## User Session Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\nclass AuthService {\n static async saveUserSession(user: User, token: string) {\n await Promise.all([\n storage.setItem('currentUser', JSON.stringify(user)),\n storage.setItem('authToken', token),\n storage.setItem('loginTime', new Date().toISOString()),\n ]);\n }\n\n static async getUserSession() {\n const userData = await storage.getItem('currentUser');\n const token = await storage.getItem('authToken');\n\n const user = userData ? JSON.parse(userData) as User : null;\n return user && token ? { user, token } : null;\n }\n\n static async clearSession() {\n await Promise.all([\n storage.removeItem('currentUser'),\n storage.removeItem('authToken'),\n storage.removeItem('loginTime'),\n ]);\n }\n}\n\\`\\`\\`\n\n## Settings Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface AppSettings {\n theme: 'light' | 'dark';\n notifications: boolean;\n language: string;\n fontSize: number;\n}\n\nconst defaultSettings: AppSettings = {\n theme: 'light',\n notifications: true,\n language: 'en',\n fontSize: 16,\n};\n\nclass SettingsService {\n static async getSettings(): Promise<AppSettings> {\n const data = await storage.getItem('appSettings');\n const stored = data ? JSON.parse(data) as AppSettings : null;\n return stored ? { ...defaultSettings, ...stored } : defaultSettings;\n }\n\n static async updateSettings(newSettings: Partial<AppSettings>) {\n const current = await this.getSettings();\n const updated = { ...current, ...newSettings };\n await storage.setItem('appSettings', JSON.stringify(updated));\n return updated;\n }\n\n static async resetSettings() {\n await storage.setItem('appSettings', JSON.stringify(defaultSettings));\n return defaultSettings;\n }\n}\n\\`\\`\\`\n\n## Cache with Expiration\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface CacheItem<T> {\n data: T;\n timestamp: number;\n expiresIn: number; // milliseconds\n}\n\nclass CacheService {\n static async setCache<T>(key: string, data: T, expiresIn: number = 3600000) {\n const cacheItem: CacheItem<T> = {\n data,\n timestamp: Date.now(),\n expiresIn,\n };\n\n await storage.setItem(\\`cache_\\${key}\\`, JSON.stringify(cacheItem));\n }\n\n static async getCache<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(\\`cache_\\${key}\\`);\n if (!data) return null;\n\n const cacheItem = JSON.parse(data) as CacheItem<T>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n\n if (isExpired) {\n await storage.removeItem(\\`cache_\\${key}\\`);\n return null;\n }\n\n return cacheItem.data;\n }\n\n static async clearExpiredCache() {\n const keys = await storage.getAllKeys();\n const cacheKeys = keys.filter(key => key.startsWith('cache_'));\n\n for (const key of cacheKeys) {\n const data = await storage.getItem(key);\n if (data) {\n const cacheItem = JSON.parse(data) as CacheItem<unknown>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n if (isExpired) {\n await storage.removeItem(key);\n }\n }\n }\n }\n}\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\n\nconst LANGUAGE_KEY = 'app_language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n storage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n storage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## React Hook for Storage\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function useStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(initialValue);\n const [loading, setLoading] = useState(true);\n\n // Load value on mount\n useEffect(() => {\n storage.getItem(key).then((stored) => {\n if (stored !== null) {\n setValue(JSON.parse(stored) as T);\n }\n setLoading(false);\n });\n }, [key]);\n\n // Update storage when value changes\n const updateValue = useCallback(async (newValue: T) => {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n // Remove from storage\n const removeValue = useCallback(async () => {\n setValue(initialValue);\n await storage.removeItem(key);\n }, [key, initialValue]);\n\n return { value, setValue: updateValue, removeValue, loading };\n}\n\n// Usage\nfunction MyComponent() {\n const { value: theme, setValue: setTheme, loading } = useStorage('theme', 'light');\n\n if (loading) return <ActivityIndicator />;\n\n return (\n <Button onPress={() => setTheme(theme === 'light' ? 'dark' : 'light')}>\n Toggle Theme\n </Button>\n );\n}\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\nasync function safeStorageOperation() {\n try {\n await storage.setItem('data', JSON.stringify(largeObject));\n } catch (error) {\n console.error('Storage failed:', error);\n // Handle storage quota exceeded or other errors\n }\n\n // Or with null checking\n const result = await storage.getItem('data');\n if (result === null) {\n // Key doesn't exist or retrieval failed\n console.log('No data found');\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use JSON.stringify/parse** - Storage only accepts strings, so serialize objects\n2. **Handle Nulls** - Always check for null returns from \\`getItem\\`\n3. **Batch Operations** - Use \\`Promise.all\\` for multiple storage operations\n4. **Error Handling** - Wrap storage operations in try-catch blocks for critical data\n5. **Key Naming** - Use consistent, descriptive key names\n6. **Data Size** - Keep stored objects reasonably sized\n7. **Cleanup** - Periodically clean up unused data\n8. **Type Safety** - Create typed wrapper functions for better TypeScript support\n`,\n};\n","export const iconGuide = `# Material Design Icons Reference\n\nIdealyst uses Material Design Icons (@mdi/react) with **7,447 icons** available.\n\n## Icon Usage\n\n### In Components\n\nIcons can be used by providing the icon name as a string:\n\n\\`\\`\\`tsx\nimport { Button, Icon, List, Badge } from '@idealyst/components';\n\n// Button with icon\n<Button icon=\"check\">Save</Button>\n\n// Standalone Icon\n<Icon name=\"home\" size=\"md\" color=\"primary\" />\n\n// List with icons\n<ListItem label=\"Settings\" leading=\"cog\" trailing=\"chevron-right\" />\n\n// Badge with icon\n<Badge icon=\"star\">Featured</Badge>\n\\`\\`\\`\n\n### Icon Properties\n\n\\`\\`\\`tsx\n<Icon\n name=\"home\" // Icon name (required)\n size=\"xs|sm|md|lg|xl|number\" // Icon size\n color=\"primary|secondary|...\" // Theme color\n/>\n\\`\\`\\`\n\n## Common Icons by Category\n\n### Navigation & Actions\n- **home** - Home/dashboard\n- **menu** - Hamburger menu\n- **arrow-left** - Back/previous\n- **arrow-right** - Forward/next\n- **chevron-left** - Small back arrow\n- **chevron-right** - Small forward arrow\n- **chevron-up** - Collapse/up\n- **chevron-down** - Expand/down\n- **close** - Close/dismiss\n- **check** - Confirm/success\n- **plus** - Add/create\n- **minus** - Remove/subtract\n- **delete** - Delete/trash\n- **dots-vertical** - More options (vertical)\n- **dots-horizontal** - More options (horizontal)\n\n### User & Account\n- **account** - User profile\n- **account-circle** - User avatar\n- **account-multiple** - Multiple users/team\n- **account-plus** - Add user\n- **account-minus** - Remove user\n- **account-edit** - Edit profile\n- **account-cog** - User settings\n- **login** - Login/sign in\n- **logout** - Logout/sign out\n- **account-key** - Authentication\n\n### Communication\n- **email** - Email/mail\n- **email-outline** - Email outline variant\n- **message** - Message/chat\n- **message-text** - Text message\n- **message-reply** - Reply to message\n- **phone** - Phone/call\n- **bell** - Notifications\n- **bell-outline** - Notifications outline\n- **comment** - Comment/feedback\n- **forum** - Discussion/forum\n\n### File & Document\n- **file** - Generic file\n- **file-document** - Document\n- **file-pdf** - PDF file\n- **file-image** - Image file\n- **folder** - Folder\n- **folder-open** - Open folder\n- **download** - Download\n- **upload** - Upload\n- **attachment** - Attach file\n- **cloud-upload** - Cloud upload\n- **cloud-download** - Cloud download\n\n### Media\n- **play** - Play media\n- **pause** - Pause media\n- **stop** - Stop media\n- **skip-next** - Next track\n- **skip-previous** - Previous track\n- **volume-high** - High volume\n- **volume-low** - Low volume\n- **volume-off** - Muted\n- **image** - Picture/photo\n- **camera** - Camera\n- **video** - Video\n\n### Edit & Create\n- **pencil** - Edit\n- **pencil-outline** - Edit outline\n- **content-save** - Save\n- **content-copy** - Copy\n- **content-cut** - Cut\n- **content-paste** - Paste\n- **undo** - Undo\n- **redo** - Redo\n- **format-bold** - Bold text\n- **format-italic** - Italic text\n- **format-underline** - Underline text\n\n### Status & Alerts\n- **check-circle** - Success\n- **check-circle-outline** - Success outline\n- **alert** - Warning\n- **alert-circle** - Alert circle\n- **alert-octagon** - Critical alert\n- **information** - Information\n- **information-outline** - Info outline\n- **help-circle** - Help/question\n- **close-circle** - Error\n- **clock** - Time/pending\n\n### UI Elements\n- **magnify** - Search\n- **filter** - Filter\n- **sort** - Sort\n- **tune** - Settings/adjust\n- **cog** - Settings\n- **palette** - Theme/colors\n- **eye** - View/visible\n- **eye-off** - Hidden\n- **heart** - Favorite/like\n- **heart-outline** - Like outline\n- **star** - Star/rating\n- **star-outline** - Star outline\n- **bookmark** - Bookmark\n- **bookmark-outline** - Bookmark outline\n\n### Shopping & Commerce\n- **cart** - Shopping cart\n- **cart-outline** - Cart outline\n- **cash** - Money/payment\n- **credit-card** - Credit card\n- **tag** - Tag/label\n- **sale** - Sale/discount\n- **receipt** - Receipt\n- **store** - Store/shop\n\n### Social\n- **share** - Share\n- **share-variant** - Share variant\n- **thumb-up** - Like/upvote\n- **thumb-down** - Dislike/downvote\n- **emoticon** - Emoji/mood\n- **emoticon-happy** - Happy\n- **emoticon-sad** - Sad\n\n### Location & Map\n- **map** - Map\n- **map-marker** - Location pin\n- **navigation** - Navigation\n- **compass** - Compass\n- **earth** - Globe/world\n\n### Calendar & Time\n- **calendar** - Calendar\n- **calendar-today** - Today\n- **calendar-month** - Month view\n- **clock-outline** - Clock\n- **timer** - Timer\n\n### Device & Hardware\n- **laptop** - Laptop\n- **cellphone** - Mobile phone\n- **tablet** - Tablet\n- **desktop-mac** - Desktop\n- **monitor** - Monitor\n- **printer** - Printer\n- **wifi** - WiFi\n- **bluetooth** - Bluetooth\n\n### Weather\n- **weather-sunny** - Sunny\n- **weather-cloudy** - Cloudy\n- **weather-rainy** - Rainy\n- **weather-snowy** - Snowy\n- **weather-night** - Night\n- **white-balance-sunny** - Light mode\n- **weather-night** - Dark mode\n\n## Finding Icons\n\n### Total Available Icons\n**7,447 icons** from Material Design Icons\n\n### Browse All Icons\nVisit: https://pictogrammers.com/library/mdi/\n\n### Search Patterns\nIcons follow naming patterns:\n- Base name: \\`home\\`, \\`account\\`, \\`file\\`\n- Variants: \\`-outline\\`, \\`-filled\\`, \\`-off\\`, \\`-plus\\`, \\`-minus\\`\n- Combinations: \\`account-plus\\`, \\`file-document-outline\\`\n\n### Common Suffixes\n- **-outline**: Outline version\n- **-off**: Disabled/off state\n- **-plus**: Add/create\n- **-minus**: Remove/subtract\n- **-edit**: Edit action\n- **-check**: Verified/checked\n- **-alert**: Warning state\n\n## Icon Naming Tips\n\n1. **Be Specific**: Use descriptive names\n - ✅ \\`account-circle\\` for user avatar\n - ❌ \\`user\\` (not available)\n\n2. **Check Variants**: Try outline versions\n - \\`email\\` and \\`email-outline\\`\n - \\`heart\\` and \\`heart-outline\\`\n\n3. **Common Prefixes**:\n - \\`account-*\\`: User-related\n - \\`file-*\\`: File-related\n - \\`folder-*\\`: Folder-related\n - \\`arrow-*\\`: Arrows\n - \\`chevron-*\\`: Small arrows\n - \\`content-*\\`: Content actions\n\n4. **Use Hyphens**: Icon names use kebab-case\n - ✅ \\`arrow-left\\`\n - ❌ \\`arrowLeft\\` or \\`arrow_left\\`\n\n## Best Practices\n\n1. **Semantic Meaning**: Choose icons that match their function\n2. **Consistency**: Use the same icon for the same action throughout the app\n3. **Size Appropriately**: Match icon size to context\n4. **Color Purposefully**: Use theme colors for semantic meaning\n5. **Accessibility**: Always provide labels/tooltips for icon-only buttons\n\n## Examples\n\n### Button Icons\n\\`\\`\\`tsx\n<Button icon=\"content-save\">Save</Button>\n<Button icon=\"delete\" intent=\"danger\">Delete</Button>\n<Button icon=\"pencil\">Edit</Button>\n<Button icon=\"plus\">Add New</Button>\n\\`\\`\\`\n\n### List Icons\n\\`\\`\\`tsx\n<ListItem label=\"Dashboard\" leading=\"view-dashboard\" />\n<ListItem label=\"Users\" leading=\"account-multiple\" />\n<ListItem label=\"Settings\" leading=\"cog\" />\n<ListItem label=\"Logout\" leading=\"logout\" intent=\"danger\" />\n\\`\\`\\`\n\n### Navigation Icons\n\\`\\`\\`tsx\n<Button icon=\"arrow-left\" variant=\"text\">Back</Button>\n<Button icon=\"menu\" variant=\"text\">Menu</Button>\n<Button icon=\"close\" variant=\"text\">Close</Button>\n\\`\\`\\`\n\n### Status Icons\n\\`\\`\\`tsx\n<Icon name=\"check-circle\" color=\"success\" />\n<Icon name=\"alert-circle\" color=\"warning\" />\n<Icon name=\"close-circle\" color=\"danger\" />\n<Icon name=\"information-outline\" color=\"primary\" />\n\\`\\`\\`\n`;\n","/**\n * Idealyst Framework Package Registry\n * Central metadata for all @idealyst packages\n */\n\nexport interface PackageInfo {\n name: string;\n npmName: string;\n description: string;\n category: \"core\" | \"ui\" | \"media\" | \"data\" | \"auth\" | \"utility\" | \"tooling\";\n platforms: (\"web\" | \"native\" | \"node\")[];\n documentationStatus: \"full\" | \"partial\" | \"minimal\";\n installation: string;\n peerDependencies?: string[];\n features: string[];\n quickStart: string;\n apiHighlights?: string[];\n relatedPackages?: string[];\n}\n\nexport const packages: Record<string, PackageInfo> = {\n components: {\n name: \"Components\",\n npmName: \"@idealyst/components\",\n description:\n \"Cross-platform React UI components for web and React Native. Includes buttons, cards, inputs, dialogs, and 30+ more components with consistent styling.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/components @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\", \"react-native-unistyles\"],\n features: [\n \"36+ production-ready components\",\n \"Consistent API across web and native\",\n \"Theme-aware with automatic dark mode\",\n \"Accessible by default\",\n \"TypeScript-first with full type definitions\",\n \"Tree-shakeable exports\",\n ],\n quickStart: `import { Button, Card, Text } from '@idealyst/components';\n\n<Card>\n <Text variant=\"headline\">Hello World</Text>\n <Button onPress={() => console.log('Pressed!')}>\n Click Me\n </Button>\n</Card>`,\n apiHighlights: [\n \"Button, IconButton, FAB\",\n \"Card, View, Screen\",\n \"Input, Select, Checkbox, Switch\",\n \"Dialog, Popover, Menu\",\n \"Text, Link, Badge, Chip\",\n ],\n relatedPackages: [\"theme\", \"navigation\"],\n },\n\n theme: {\n name: \"Theme\",\n npmName: \"@idealyst/theme\",\n description:\n \"Cross-platform theming system built on react-native-unistyles. Provides colors, typography, spacing, and responsive breakpoints with a fluent builder API.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/theme react-native-unistyles\",\n peerDependencies: [\"react-native-unistyles\"],\n features: [\n \"Light and dark theme variants\",\n \"Semantic color tokens (intent-based)\",\n \"Fluent builder API for theme creation\",\n \"Individual color modification (add/set surface, text, border, pallet)\",\n \"Intent management (addIntent, setIntent)\",\n \"Responsive breakpoints\",\n \"Typography scale\",\n \"Spacing and sizing utilities\",\n \"Platform-specific adaptations\",\n ],\n quickStart: `import { UnistylesProvider } from '@idealyst/theme';\n\n<UnistylesProvider>\n <App />\n</UnistylesProvider>`,\n apiHighlights: [\n \"createTheme() / fromTheme(base) - Theme builder\",\n \"addIntent() / setIntent() - Intent management\",\n \"addSurfaceColor() / setSurfaceColor() - Surface colors\",\n \"addTextColor() / setTextColor() - Text colors\",\n \"addBorderColor() / setBorderColor() - Border colors\",\n \"addPalletColor() / setPalletColor() - Pallet colors\",\n \"Size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n \"Intent: 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\",\n ],\n relatedPackages: [\"components\"],\n },\n\n navigation: {\n name: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description:\n \"Unified navigation system for web and React Native. Stack, tab, drawer, and modal navigators with type-safe routing.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/navigation\",\n peerDependencies: [\"@react-navigation/native (native only)\"],\n features: [\n \"Type-safe route definitions\",\n \"Stack, Tab, Drawer, Modal navigators\",\n \"Deep linking support\",\n \"Custom layouts for web (headers, sidebars)\",\n \"useNavigator hook for navigation actions\",\n \"Cross-platform URL handling\",\n ],\n quickStart: `import { Router, useNavigator } from '@idealyst/navigation';\n\nconst routes = {\n home: { path: '/', screen: HomeScreen },\n profile: { path: '/profile/:id', screen: ProfileScreen },\n};\n\n<Router routes={routes} />`,\n apiHighlights: [\n \"Router component\",\n \"useNavigator() hook\",\n \"Route configuration\",\n \"Navigator types (stack, tabs, drawer)\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n cli: {\n name: \"CLI\",\n npmName: \"@idealyst/cli\",\n description:\n \"Command-line tool for generating Idealyst projects. Creates monorepo workspaces with web, native, API, and database packages.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"npx @idealyst/cli init my-project\",\n features: [\n \"Monorepo workspace generation\",\n \"React Native app scaffolding\",\n \"Vite-based web app generation\",\n \"tRPC API server template\",\n \"Prisma database layer\",\n \"Shared library template\",\n ],\n quickStart: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Add a native app\ncd my-app\nnpx @idealyst/cli create mobile --type native --app-name \"My App\"\n\n# Add a web app\nnpx @idealyst/cli create web --type web --with-trpc`,\n apiHighlights: [\n \"idealyst init <name>\",\n \"idealyst create <name> --type native|web|api|database|shared\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n storage: {\n name: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with async API. Uses localStorage on web and AsyncStorage on React Native.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/storage\",\n peerDependencies: [\"@react-native-async-storage/async-storage (native)\"],\n features: [\n \"Unified API across platforms\",\n \"Async/await interface\",\n \"JSON serialization built-in\",\n \"TypeScript generics for type safety\",\n \"Prefix namespacing\",\n ],\n quickStart: `import { storage } from '@idealyst/storage';\n\n// Store a value\nawait storage.set('user', { name: 'Alice', id: 1 });\n\n// Retrieve a value\nconst user = await storage.get<User>('user');\n\n// Remove a value\nawait storage.remove('user');`,\n apiHighlights: [\n \"storage.get<T>(key)\",\n \"storage.set(key, value)\",\n \"storage.remove(key)\",\n \"storage.clear()\",\n ],\n relatedPackages: [\"oauth-client\", \"config\"],\n },\n\n translate: {\n name: \"Translate\",\n npmName: \"@idealyst/translate\",\n description:\n \"Internationalization (i18n) package with runtime API and Babel plugin for static key extraction.\",\n category: \"utility\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/translate\",\n features: [\n \"TranslateProvider for app-wide i18n\",\n \"useTranslation hook\",\n \"Interpolation support\",\n \"Pluralization\",\n \"Babel plugin for key extraction\",\n \"Missing translation detection\",\n ],\n quickStart: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\nfunction App() {\n return (\n <TranslateProvider translations={translations} defaultLanguage=\"en\">\n <MyComponent />\n </TranslateProvider>\n );\n}\n\nfunction MyComponent() {\n const { t } = useTranslation();\n return <Text>{t('greeting', { name: 'World' })}</Text>;\n}`,\n apiHighlights: [\n \"TranslateProvider\",\n \"useTranslation()\",\n \"useLanguage()\",\n \"Trans component\",\n ],\n relatedPackages: [\"components\"],\n },\n\n camera: {\n name: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture. Uses react-native-vision-camera on native and MediaDevices API on web.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/camera react-native-vision-camera\",\n peerDependencies: [\"react-native-vision-camera (native)\"],\n features: [\n \"Photo capture\",\n \"Video recording\",\n \"Camera switching (front/back)\",\n \"Flash control\",\n \"Zoom support\",\n \"Permission handling\",\n ],\n quickStart: `import { Camera, useCameraPermission } from '@idealyst/camera';\n\nfunction CameraScreen() {\n const { hasPermission, requestPermission } = useCameraPermission();\n\n if (!hasPermission) {\n return <Button onPress={requestPermission}>Grant Permission</Button>;\n }\n\n return (\n <Camera\n onCapture={(photo) => console.log('Photo taken:', photo)}\n />\n );\n}`,\n apiHighlights: [\n \"Camera component\",\n \"useCameraPermission()\",\n \"useCamera()\",\n \"Photo/Video capture callbacks\",\n ],\n relatedPackages: [\"components\", \"storage\"],\n },\n\n audio: {\n name: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for React and React Native. Provides recording with real-time PCM streaming, file playback, and session management for simultaneous recording and playback.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/audio react-native-audio-api\",\n peerDependencies: [\"react-native-audio-api (native)\"],\n features: [\n \"Recording with real-time PCM streaming\",\n \"File playback (mp3, wav, etc.)\",\n \"PCM streaming playback for TTS\",\n \"Audio session management (iOS/Android)\",\n \"Simultaneous recording and playback\",\n \"Audio level monitoring\",\n \"Configurable sample rates and bit depths\",\n \"Audio profiles (speech, music, phone)\",\n ],\n quickStart: `import { useRecorder, usePlayer, AUDIO_PROFILES } from '@idealyst/audio';\n\nfunction AudioApp() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const player = usePlayer();\n\n // Record audio\n const handleRecord = async () => {\n if (recorder.isRecording) {\n await recorder.stop();\n } else {\n await recorder.start();\n }\n };\n\n // Play file\n const handlePlay = async () => {\n await player.loadFile('/audio/music.mp3');\n await player.play();\n };\n\n // Stream PCM (e.g., from TTS API)\n const handleStream = async () => {\n await player.loadPCMStream(AUDIO_PROFILES.speech);\n await player.play();\n player.feedPCMData(pcmData); // Feed PCM chunks\n };\n\n return (\n <View>\n <Button onPress={handleRecord}>\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Button onPress={handlePlay}>Play File</Button>\n </View>\n );\n}`,\n apiHighlights: [\n \"useRecorder() - Recording with PCM streaming\",\n \"usePlayer() - File and PCM playback\",\n \"useAudio() - Session management\",\n \"AUDIO_PROFILES - Pre-configured audio settings\",\n \"SESSION_PRESETS - Audio session configurations\",\n ],\n relatedPackages: [\"camera\", \"components\"],\n },\n\n datagrid: {\n name: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets. Supports sorting, filtering, and custom cell rendering.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/components\",\n \"@idealyst/theme\",\n \"react-window (web)\",\n ],\n features: [\n \"Virtualized rendering for large datasets\",\n \"Column sorting\",\n \"Row selection\",\n \"Custom cell renderers\",\n \"Fixed headers\",\n \"Responsive column sizing\",\n ],\n quickStart: `import { DataGrid } from '@idealyst/datagrid';\n\nconst columns = [\n { key: 'name', header: 'Name', width: 200 },\n { key: 'email', header: 'Email', width: 250 },\n { key: 'status', header: 'Status', width: 100 },\n];\n\n<DataGrid\n data={users}\n columns={columns}\n onRowClick={(row) => console.log('Selected:', row)}\n/>`,\n apiHighlights: [\n \"DataGrid component\",\n \"Column configuration\",\n \"Row selection callbacks\",\n \"Custom cell renderers\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n datepicker: {\n name: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description:\n \"Cross-platform date and time picker components. Includes calendar, time picker, and date range selection.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datepicker @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\"],\n features: [\n \"Date picker with calendar\",\n \"Time picker\",\n \"Date range selection\",\n \"Min/max date constraints\",\n \"Locale support\",\n \"Customizable styling\",\n ],\n quickStart: `import { DatePicker, TimePicker } from '@idealyst/datepicker';\n\n<DatePicker\n value={selectedDate}\n onChange={setSelectedDate}\n minDate={new Date()}\n/>\n\n<TimePicker\n value={selectedTime}\n onChange={setSelectedTime}\n is24Hour={true}\n/>`,\n apiHighlights: [\n \"DatePicker component\",\n \"TimePicker component\",\n \"DateRangePicker component\",\n \"Calendar component\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n \"oauth-client\": {\n name: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description:\n \"Universal OAuth2 client for web and React Native. Supports authorization code flow with PKCE.\",\n category: \"auth\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n peerDependencies: [\"@idealyst/storage\"],\n features: [\n \"Authorization code flow with PKCE\",\n \"Token refresh handling\",\n \"Secure token storage\",\n \"Multiple provider support\",\n \"Silent token refresh\",\n \"Logout handling\",\n ],\n quickStart: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'myapp://callback',\n});\n\n// Start login flow\nawait oauth.login();\n\n// Get access token\nconst token = await oauth.getAccessToken();\n\n// Logout\nawait oauth.logout();`,\n apiHighlights: [\n \"OAuthClient class\",\n \"login() / logout()\",\n \"getAccessToken()\",\n \"Token refresh handling\",\n ],\n relatedPackages: [\"storage\", \"navigation\"],\n },\n\n config: {\n name: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support. Type-safe access to env vars on web and native.\",\n category: \"utility\",\n platforms: [\"web\", \"native\", \"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/config\",\n peerDependencies: [\"react-native-config (native)\"],\n features: [\n \"Type-safe environment variables\",\n \"Cross-platform API\",\n \"Build-time configuration\",\n \"Vite plugin for web\",\n \"React Native Config integration\",\n \"Default value support\",\n ],\n quickStart: `// config.ts\nimport { defineConfig } from '@idealyst/config';\n\nexport const config = defineConfig({\n API_URL: { required: true },\n DEBUG: { default: 'false' },\n APP_NAME: { default: 'My App' },\n});\n\n// Usage\nimport { config } from './config';\nconsole.log(config.API_URL);`,\n apiHighlights: [\n \"defineConfig()\",\n \"Type-safe config object\",\n \"Vite plugin\",\n \"CLI for generation\",\n ],\n relatedPackages: [\"storage\"],\n },\n\n tooling: {\n name: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description:\n \"Code analysis and validation utilities for Idealyst Framework. Includes Vite plugins and static analyzers.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add -D @idealyst/tooling\",\n features: [\n \"Component usage analysis\",\n \"Import validation\",\n \"Vite plugin for build-time checks\",\n \"Custom rule definitions\",\n \"Documentation generation\",\n ],\n quickStart: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [\n idealystPlugin({\n validateImports: true,\n analyzeUsage: true,\n }),\n ],\n};`,\n apiHighlights: [\n \"idealystPlugin() for Vite\",\n \"analyzeComponent()\",\n \"Custom rule API\",\n ],\n relatedPackages: [\"cli\"],\n },\n\n \"mcp-server\": {\n name: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server providing AI assistants with Idealyst framework documentation, types, and examples.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/mcp-server\",\n features: [\n \"Component documentation\",\n \"Type extraction from source\",\n \"Validated code examples\",\n \"Icon search (7,447 MDI icons)\",\n \"Navigation and theme guides\",\n \"CLI command reference\",\n ],\n quickStart: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n apiHighlights: [\n \"list_components\",\n \"get_component_docs\",\n \"search_icons\",\n \"get_*_types\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n markdown: {\n name: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer for React and React Native. Supports GitHub Flavored Markdown with theme integration.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/markdown @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"react-markdown (web)\",\n \"remark-gfm (web)\",\n \"react-native-markdown-display (native)\",\n ],\n features: [\n \"GitHub Flavored Markdown support\",\n \"Tables, strikethrough, task lists\",\n \"Theme-integrated styling\",\n \"Custom link and image handlers\",\n \"Style overrides per element\",\n \"Cross-platform consistency\",\n ],\n quickStart: `import { Markdown } from '@idealyst/markdown';\n\n<Markdown\n size=\"md\"\n linkIntent=\"primary\"\n linkHandler={{\n onLinkPress: (url) => console.log('Link:', url),\n }}\n>\n{\\`# Hello World\n\nThis is **bold** and _italic_ text.\n\n| Column 1 | Column 2 |\n|----------|----------|\n| Data 1 | Data 2 |\n\\`}\n</Markdown>`,\n apiHighlights: [\n \"Markdown component\",\n \"size prop (xs-xl)\",\n \"linkIntent prop\",\n \"styleOverrides prop\",\n \"linkHandler / imageHandler\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n};\n\n/**\n * Get all packages grouped by category\n */\nexport function getPackagesByCategory(): Record<string, PackageInfo[]> {\n const grouped: Record<string, PackageInfo[]> = {};\n\n for (const pkg of Object.values(packages)) {\n if (!grouped[pkg.category]) {\n grouped[pkg.category] = [];\n }\n grouped[pkg.category].push(pkg);\n }\n\n return grouped;\n}\n\n/**\n * Get a summary list of all packages\n */\nexport function getPackageSummary(): Array<{\n name: string;\n npmName: string;\n category: string;\n description: string;\n platforms: string[];\n documentationStatus: string;\n}> {\n return Object.entries(packages).map(([key, pkg]) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n}\n\n/**\n * Search packages by query\n */\nexport function searchPackages(query: string): PackageInfo[] {\n const lowerQuery = query.toLowerCase();\n\n return Object.values(packages).filter(\n (pkg) =>\n pkg.name.toLowerCase().includes(lowerQuery) ||\n pkg.npmName.toLowerCase().includes(lowerQuery) ||\n pkg.description.toLowerCase().includes(lowerQuery) ||\n pkg.features.some((f) => f.toLowerCase().includes(lowerQuery)) ||\n pkg.category.toLowerCase().includes(lowerQuery)\n );\n}\n","/**\n * Idealyst Recipes - Common UI Patterns\n * Ready-to-use code examples for building apps with Idealyst\n */\n\nexport interface Recipe {\n name: string;\n description: string;\n category: \"forms\" | \"navigation\" | \"data\" | \"layout\" | \"auth\" | \"settings\" | \"media\";\n difficulty: \"beginner\" | \"intermediate\" | \"advanced\";\n packages: string[];\n code: string;\n explanation: string;\n tips?: string[];\n relatedRecipes?: string[];\n}\n\nexport const recipes: Record<string, Recipe> = {\n \"login-form\": {\n name: \"Login Form\",\n description: \"A complete login form with email/password validation and error handling\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, Input, Card, Text, View } from '@idealyst/components';\n\ninterface LoginFormProps {\n onSubmit: (email: string, password: string) => Promise<void>;\n onForgotPassword?: () => void;\n}\n\nexport function LoginForm({ onSubmit, onForgotPassword }: LoginFormProps) {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [errors, setErrors] = useState<{ email?: string; password?: string }>({});\n const [isLoading, setIsLoading] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const validate = () => {\n const newErrors: typeof errors = {};\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n setSubmitError(null);\n\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit(email, password);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : 'Login failed');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text variant=\"headline\" style={{ marginBottom: 24 }}>\n Sign In\n </Text>\n\n {submitError && (\n <View style={{ marginBottom: 16 }}>\n <Text intent=\"danger\">{submitError}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n error={errors.email}\n />\n\n <Input\n label=\"Password\"\n placeholder=\"Enter your password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n autoComplete=\"current-password\"\n error={errors.password}\n />\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Sign In\n </Button>\n\n {onForgotPassword && (\n <Button type=\"text\" onPress={onForgotPassword}>\n Forgot Password?\n </Button>\n )}\n </View>\n </Card>\n );\n}`,\n explanation: `This login form demonstrates:\n- Controlled inputs with useState\n- Client-side validation with error messages\n- Loading state during submission\n- Error handling for failed login attempts\n- Proper keyboard types and autocomplete hints for better UX`,\n tips: [\n \"Add onBlur validation for immediate feedback\",\n \"Consider using react-hook-form for complex forms\",\n \"Store tokens securely using @idealyst/storage after successful login\",\n ],\n relatedRecipes: [\"signup-form\", \"forgot-password\", \"protected-route\"],\n },\n\n \"signup-form\": {\n name: \"Signup Form\",\n description: \"User registration form with password confirmation and terms acceptance\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, Input, Card, Text, View, Checkbox, Link } from '@idealyst/components';\n\ninterface SignupFormProps {\n onSubmit: (data: { name: string; email: string; password: string }) => Promise<void>;\n onTermsPress?: () => void;\n}\n\nexport function SignupForm({ onSubmit, onTermsPress }: SignupFormProps) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [acceptedTerms, setAcceptedTerms] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const validate = () => {\n const newErrors: Record<string, string> = {};\n\n if (!name.trim()) {\n newErrors.name = 'Name is required';\n }\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n if (password !== confirmPassword) {\n newErrors.confirmPassword = 'Passwords do not match';\n }\n\n if (!acceptedTerms) {\n newErrors.terms = 'You must accept the terms and conditions';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit({ name, email, password });\n } catch (error) {\n setErrors({ submit: error instanceof Error ? error.message : 'Signup failed' });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text variant=\"headline\" style={{ marginBottom: 24 }}>\n Create Account\n </Text>\n\n {errors.submit && (\n <View style={{ marginBottom: 16 }}>\n <Text intent=\"danger\">{errors.submit}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <Input\n label=\"Full Name\"\n placeholder=\"John Doe\"\n value={name}\n onChangeText={setName}\n autoComplete=\"name\"\n error={errors.name}\n />\n\n <Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n error={errors.email}\n />\n\n <Input\n label=\"Password\"\n placeholder=\"At least 8 characters\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n autoComplete=\"new-password\"\n error={errors.password}\n />\n\n <Input\n label=\"Confirm Password\"\n placeholder=\"Confirm your password\"\n value={confirmPassword}\n onChangeText={setConfirmPassword}\n secureTextEntry\n autoComplete=\"new-password\"\n error={errors.confirmPassword}\n />\n\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n <Checkbox\n checked={acceptedTerms}\n onChange={setAcceptedTerms}\n />\n <Text>\n I agree to the{' '}\n <Link onPress={onTermsPress}>Terms and Conditions</Link>\n </Text>\n </View>\n {errors.terms && <Text intent=\"danger\" size=\"sm\">{errors.terms}</Text>}\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Create Account\n </Button>\n </View>\n </Card>\n );\n}`,\n explanation: `This signup form includes:\n- Multiple field validation including password matching\n- Terms and conditions checkbox with validation\n- Proper autocomplete hints for password managers\n- Loading and error states`,\n tips: [\n \"Add password strength indicator for better UX\",\n \"Consider email verification flow after signup\",\n \"Use secure password hashing on the backend\",\n ],\n relatedRecipes: [\"login-form\", \"email-verification\"],\n },\n\n \"settings-screen\": {\n name: \"Settings Screen\",\n description: \"App settings screen with toggles, selections, and grouped options\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { useState, useEffect } from 'react';\nimport { ScrollView } from 'react-native';\nimport {\n View, Text, Switch, Select, Card, Divider, Icon\n} from '@idealyst/components';\nimport { storage } from '@idealyst/storage';\n\ninterface Settings {\n notifications: boolean;\n emailUpdates: boolean;\n darkMode: boolean;\n language: string;\n fontSize: string;\n}\n\nconst defaultSettings: Settings = {\n notifications: true,\n emailUpdates: false,\n darkMode: false,\n language: 'en',\n fontSize: 'medium',\n};\n\nexport function SettingsScreen() {\n const [settings, setSettings] = useState<Settings>(defaultSettings);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n loadSettings();\n }, []);\n\n const loadSettings = async () => {\n try {\n const saved = await storage.get<Settings>('user-settings');\n if (saved) {\n setSettings(saved);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const updateSetting = async <K extends keyof Settings>(\n key: K,\n value: Settings[K]\n ) => {\n const newSettings = { ...settings, [key]: value };\n setSettings(newSettings);\n await storage.set('user-settings', newSettings);\n };\n\n if (isLoading) {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text>Loading...</Text>\n </View>;\n }\n\n return (\n <ScrollView style={{ flex: 1 }}>\n <View style={{ padding: 16, gap: 16 }}>\n {/* Notifications Section */}\n <Card>\n <Text variant=\"title\" style={{ marginBottom: 16 }}>\n Notifications\n </Text>\n\n <SettingRow\n icon=\"bell\"\n label=\"Push Notifications\"\n description=\"Receive push notifications\"\n >\n <Switch\n checked={settings.notifications}\n onChange={(v) => updateSetting('notifications', v)}\n />\n </SettingRow>\n\n <Divider />\n\n <SettingRow\n icon=\"email\"\n label=\"Email Updates\"\n description=\"Receive weekly email updates\"\n >\n <Switch\n checked={settings.emailUpdates}\n onChange={(v) => updateSetting('emailUpdates', v)}\n />\n </SettingRow>\n </Card>\n\n {/* Appearance Section */}\n <Card>\n <Text variant=\"title\" style={{ marginBottom: 16 }}>\n Appearance\n </Text>\n\n <SettingRow\n icon=\"theme-light-dark\"\n label=\"Dark Mode\"\n description=\"Use dark theme\"\n >\n <Switch\n checked={settings.darkMode}\n onChange={(v) => updateSetting('darkMode', v)}\n />\n </SettingRow>\n\n <Divider />\n\n <SettingRow\n icon=\"format-size\"\n label=\"Font Size\"\n >\n <Select\n value={settings.fontSize}\n onChange={(v) => updateSetting('fontSize', v)}\n options={[\n { label: 'Small', value: 'small' },\n { label: 'Medium', value: 'medium' },\n { label: 'Large', value: 'large' },\n ]}\n style={{ width: 120 }}\n />\n </SettingRow>\n </Card>\n\n {/* Language Section */}\n <Card>\n <Text variant=\"title\" style={{ marginBottom: 16 }}>\n Language & Region\n </Text>\n\n <SettingRow\n icon=\"translate\"\n label=\"Language\"\n >\n <Select\n value={settings.language}\n onChange={(v) => updateSetting('language', v)}\n options={[\n { label: 'English', value: 'en' },\n { label: 'Spanish', value: 'es' },\n { label: 'French', value: 'fr' },\n { label: 'German', value: 'de' },\n ]}\n style={{ width: 140 }}\n />\n </SettingRow>\n </Card>\n </View>\n </ScrollView>\n );\n}\n\n// Helper component for consistent setting rows\nfunction SettingRow({\n icon,\n label,\n description,\n children\n}: {\n icon: string;\n label: string;\n description?: string;\n children: React.ReactNode;\n}) {\n return (\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12, flex: 1 }}>\n <Icon name={icon} size={24} />\n <View style={{ flex: 1 }}>\n <Text>{label}</Text>\n {description && (\n <Text size=\"sm\" style={{ opacity: 0.7 }}>{description}</Text>\n )}\n </View>\n </View>\n {children}\n </View>\n );\n}`,\n explanation: `This settings screen demonstrates:\n- Loading and persisting settings with @idealyst/storage\n- Grouped settings sections with Cards\n- Switch toggles for boolean options\n- Select dropdowns for choices\n- Reusable SettingRow component for consistent layout`,\n tips: [\n \"Consider debouncing saves for rapid toggles\",\n \"Add a 'Reset to Defaults' option\",\n \"Sync settings with backend for cross-device consistency\",\n ],\n relatedRecipes: [\"theme-switcher\", \"profile-screen\"],\n },\n\n \"theme-switcher\": {\n name: \"Theme Switcher\",\n description: \"Toggle between light and dark mode with persistence\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { UnistylesRuntime } from 'react-native-unistyles';\nimport { storage } from '@idealyst/storage';\nimport { Switch, View, Text, Icon } from '@idealyst/components';\n\ntype ThemeMode = 'light' | 'dark' | 'system';\n\ninterface ThemeContextType {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n isDark: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [mode, setModeState] = useState<ThemeMode>('system');\n const [isLoaded, setIsLoaded] = useState(false);\n\n useEffect(() => {\n loadTheme();\n }, []);\n\n useEffect(() => {\n if (!isLoaded) return;\n\n // Apply theme based on mode\n if (mode === 'system') {\n UnistylesRuntime.setAdaptiveThemes(true);\n } else {\n UnistylesRuntime.setAdaptiveThemes(false);\n UnistylesRuntime.setTheme(mode);\n }\n }, [mode, isLoaded]);\n\n const loadTheme = async () => {\n const saved = await storage.get<ThemeMode>('theme-mode');\n if (saved) {\n setModeState(saved);\n }\n setIsLoaded(true);\n };\n\n const setMode = async (newMode: ThemeMode) => {\n setModeState(newMode);\n await storage.set('theme-mode', newMode);\n };\n\n const isDark = mode === 'dark' ||\n (mode === 'system' && UnistylesRuntime.colorScheme === 'dark');\n\n if (!isLoaded) return null;\n\n return (\n <ThemeContext.Provider value={{ mode, setMode, isDark }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider');\n }\n return context;\n}\n\n// Simple toggle component\nexport function ThemeToggle() {\n const { isDark, setMode } = useTheme();\n\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Icon name={isDark ? 'weather-night' : 'weather-sunny'} size={24} />\n <Text>Dark Mode</Text>\n <Switch\n checked={isDark}\n onChange={(checked) => setMode(checked ? 'dark' : 'light')}\n />\n </View>\n );\n}\n\n// Full selector with system option\nexport function ThemeSelector() {\n const { mode, setMode } = useTheme();\n\n return (\n <View style={{ gap: 8 }}>\n <ThemeOption\n label=\"Light\"\n icon=\"weather-sunny\"\n selected={mode === 'light'}\n onPress={() => setMode('light')}\n />\n <ThemeOption\n label=\"Dark\"\n icon=\"weather-night\"\n selected={mode === 'dark'}\n onPress={() => setMode('dark')}\n />\n <ThemeOption\n label=\"System\"\n icon=\"cellphone\"\n selected={mode === 'system'}\n onPress={() => setMode('system')}\n />\n </View>\n );\n}\n\nfunction ThemeOption({\n label,\n icon,\n selected,\n onPress\n}: {\n label: string;\n icon: string;\n selected: boolean;\n onPress: () => void;\n}) {\n return (\n <Pressable onPress={onPress}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 12,\n borderRadius: 8,\n backgroundColor: selected ? 'rgba(0,0,0,0.1)' : 'transparent',\n }}>\n <Icon name={icon} size={20} />\n <Text>{label}</Text>\n {selected && <Icon name=\"check\" size={20} intent=\"success\" />}\n </View>\n </Pressable>\n );\n}`,\n explanation: `This theme switcher provides:\n- ThemeProvider context for app-wide theme state\n- Persistence with @idealyst/storage\n- Support for light, dark, and system-follow modes\n- Integration with Unistyles runtime\n- Both simple toggle and full selector UI components`,\n tips: [\n \"Wrap your app root with ThemeProvider\",\n \"The system option follows device settings automatically\",\n \"Theme changes are instant with no reload required\",\n ],\n relatedRecipes: [\"settings-screen\"],\n },\n\n \"tab-navigation\": {\n name: \"Tab Navigation\",\n description: \"Bottom tab navigation with icons and badges\",\n category: \"navigation\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { Router, TabBar } from '@idealyst/navigation';\nimport { Icon, Badge, View } from '@idealyst/components';\n\n// Define your screens\nfunction HomeScreen() {\n return <View><Text>Home</Text></View>;\n}\n\nfunction SearchScreen() {\n return <View><Text>Search</Text></View>;\n}\n\nfunction NotificationsScreen() {\n return <View><Text>Notifications</Text></View>;\n}\n\nfunction ProfileScreen() {\n return <View><Text>Profile</Text></View>;\n}\n\n// Route configuration\nconst routes = {\n home: {\n path: '/',\n screen: HomeScreen,\n options: {\n title: 'Home',\n tabBarIcon: ({ focused }: { focused: boolean }) => (\n <Icon name={focused ? 'home' : 'home-outline'} size={24} />\n ),\n },\n },\n search: {\n path: '/search',\n screen: SearchScreen,\n options: {\n title: 'Search',\n tabBarIcon: ({ focused }: { focused: boolean }) => (\n <Icon name={focused ? 'magnify' : 'magnify'} size={24} />\n ),\n },\n },\n notifications: {\n path: '/notifications',\n screen: NotificationsScreen,\n options: {\n title: 'Notifications',\n tabBarIcon: ({ focused }: { focused: boolean }) => (\n <View>\n <Icon name={focused ? 'bell' : 'bell-outline'} size={24} />\n {/* Show badge when there are unread notifications */}\n <Badge\n count={3}\n style={{ position: 'absolute', top: -4, right: -8 }}\n />\n </View>\n ),\n },\n },\n profile: {\n path: '/profile',\n screen: ProfileScreen,\n options: {\n title: 'Profile',\n tabBarIcon: ({ focused }: { focused: boolean }) => (\n <Icon name={focused ? 'account' : 'account-outline'} size={24} />\n ),\n },\n },\n};\n\nexport function App() {\n return (\n <Router\n routes={routes}\n navigator=\"tabs\"\n tabBarPosition=\"bottom\"\n />\n );\n}`,\n explanation: `This tab navigation setup includes:\n- Four tabs with icons that change when focused\n- Badge on notifications tab for unread count\n- Type-safe route configuration\n- Works on both web and native`,\n tips: [\n \"Use outline/filled icon variants to indicate focus state\",\n \"Keep tab count to 3-5 for best usability\",\n \"Consider hiding tabs on certain screens (like detail views)\",\n ],\n relatedRecipes: [\"drawer-navigation\", \"stack-navigation\", \"protected-route\"],\n },\n\n \"drawer-navigation\": {\n name: \"Drawer Navigation\",\n description: \"Side drawer menu with navigation items and user profile\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { Router, useNavigator } from '@idealyst/navigation';\nimport { View, Text, Icon, Avatar, Pressable, Divider } from '@idealyst/components';\n\n// Custom drawer content\nfunction DrawerContent() {\n const { navigate, currentRoute } = useNavigator();\n\n const menuItems = [\n { route: 'home', icon: 'home', label: 'Home' },\n { route: 'dashboard', icon: 'view-dashboard', label: 'Dashboard' },\n { route: 'messages', icon: 'message', label: 'Messages' },\n { route: 'settings', icon: 'cog', label: 'Settings' },\n ];\n\n return (\n <View style={{ flex: 1, padding: 16 }}>\n {/* User Profile Header */}\n <View style={{ alignItems: 'center', paddingVertical: 24 }}>\n <Avatar\n source={{ uri: 'https://example.com/avatar.jpg' }}\n size=\"lg\"\n />\n <Text variant=\"title\" style={{ marginTop: 12 }}>John Doe</Text>\n <Text size=\"sm\" style={{ opacity: 0.7 }}>john@example.com</Text>\n </View>\n\n <Divider style={{ marginVertical: 16 }} />\n\n {/* Menu Items */}\n <View style={{ gap: 4 }}>\n {menuItems.map((item) => (\n <DrawerItem\n key={item.route}\n icon={item.icon}\n label={item.label}\n active={currentRoute === item.route}\n onPress={() => navigate(item.route)}\n />\n ))}\n </View>\n\n {/* Footer */}\n <View style={{ marginTop: 'auto' }}>\n <Divider style={{ marginVertical: 16 }} />\n <DrawerItem\n icon=\"logout\"\n label=\"Sign Out\"\n onPress={() => {\n // Handle logout\n }}\n />\n </View>\n </View>\n );\n}\n\nfunction DrawerItem({\n icon,\n label,\n active,\n onPress\n}: {\n icon: string;\n label: string;\n active?: boolean;\n onPress: () => void;\n}) {\n return (\n <Pressable onPress={onPress}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 16,\n padding: 12,\n borderRadius: 8,\n backgroundColor: active ? 'rgba(0,0,0,0.1)' : 'transparent',\n }}>\n <Icon name={icon} size={24} intent={active ? 'primary' : undefined} />\n <Text intent={active ? 'primary' : undefined}>{label}</Text>\n </View>\n </Pressable>\n );\n}\n\n// Route configuration\nconst routes = {\n home: { path: '/', screen: HomeScreen },\n dashboard: { path: '/dashboard', screen: DashboardScreen },\n messages: { path: '/messages', screen: MessagesScreen },\n settings: { path: '/settings', screen: SettingsScreen },\n};\n\nexport function App() {\n return (\n <Router\n routes={routes}\n navigator=\"drawer\"\n drawerContent={DrawerContent}\n />\n );\n}`,\n explanation: `This drawer navigation includes:\n- Custom drawer content with user profile\n- Active state highlighting for current route\n- Grouped menu items with icons\n- Sign out button at the bottom\n- Works on both web (sidebar) and native (slide-out drawer)`,\n tips: [\n \"Add a hamburger menu button to open drawer on native\",\n \"Consider using drawer on tablet/desktop, tabs on mobile\",\n \"Add gesture support for swipe-to-open on native\",\n ],\n relatedRecipes: [\"tab-navigation\", \"stack-navigation\"],\n },\n\n \"protected-route\": {\n name: \"Protected Routes\",\n description: \"Redirect unauthenticated users to login with auth state management\",\n category: \"auth\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/navigation\", \"@idealyst/storage\", \"@idealyst/components\"],\n code: `import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { Router, useNavigator } from '@idealyst/navigation';\nimport { storage } from '@idealyst/storage';\nimport { View, Text, ActivityIndicator } from '@idealyst/components';\n\n// Auth Context\ninterface User {\n id: string;\n email: string;\n name: string;\n}\n\ninterface AuthContextType {\n user: User | null;\n isLoading: boolean;\n login: (email: string, password: string) => Promise<void>;\n logout: () => Promise<void>;\n}\n\nconst AuthContext = createContext<AuthContextType | null>(null);\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n checkAuth();\n }, []);\n\n const checkAuth = async () => {\n try {\n const token = await storage.get<string>('auth-token');\n if (token) {\n // Validate token and get user data\n const userData = await fetchUser(token);\n setUser(userData);\n }\n } catch (error) {\n // Token invalid or expired\n await storage.remove('auth-token');\n } finally {\n setIsLoading(false);\n }\n };\n\n const login = async (email: string, password: string) => {\n const { token, user } = await apiLogin(email, password);\n await storage.set('auth-token', token);\n setUser(user);\n };\n\n const logout = async () => {\n await storage.remove('auth-token');\n setUser(null);\n };\n\n return (\n <AuthContext.Provider value={{ user, isLoading, login, logout }}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth() {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within AuthProvider');\n }\n return context;\n}\n\n// Protected Route Wrapper\nfunction ProtectedRoute({ children }: { children: React.ReactNode }) {\n const { user, isLoading } = useAuth();\n const { navigate } = useNavigator();\n\n useEffect(() => {\n if (!isLoading && !user) {\n navigate('login');\n }\n }, [user, isLoading]);\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n if (!user) {\n return null; // Will redirect\n }\n\n return <>{children}</>;\n}\n\n// Route configuration\nconst routes = {\n login: {\n path: '/login',\n screen: LoginScreen,\n options: { public: true },\n },\n signup: {\n path: '/signup',\n screen: SignupScreen,\n options: { public: true },\n },\n home: {\n path: '/',\n screen: () => (\n <ProtectedRoute>\n <HomeScreen />\n </ProtectedRoute>\n ),\n },\n profile: {\n path: '/profile',\n screen: () => (\n <ProtectedRoute>\n <ProfileScreen />\n </ProtectedRoute>\n ),\n },\n settings: {\n path: '/settings',\n screen: () => (\n <ProtectedRoute>\n <SettingsScreen />\n </ProtectedRoute>\n ),\n },\n};\n\nexport function App() {\n return (\n <AuthProvider>\n <Router routes={routes} />\n </AuthProvider>\n );\n}`,\n explanation: `This protected routes setup includes:\n- AuthProvider context for app-wide auth state\n- Token persistence with @idealyst/storage\n- Loading state while checking authentication\n- Automatic redirect to login for unauthenticated users\n- ProtectedRoute wrapper component for easy use`,\n tips: [\n \"Add token refresh logic for long-lived sessions\",\n \"Consider deep link handling for login redirects\",\n \"Use @idealyst/oauth-client for OAuth flows\",\n ],\n relatedRecipes: [\"login-form\", \"oauth-flow\"],\n },\n\n \"data-list\": {\n name: \"Data List with Pull-to-Refresh\",\n description: \"Scrollable list with pull-to-refresh, loading states, and empty state\",\n category: \"data\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useEffect, useCallback } from 'react';\nimport { FlatList, RefreshControl } from 'react-native';\nimport { View, Text, Card, ActivityIndicator, Button, Icon } from '@idealyst/components';\n\ninterface Item {\n id: string;\n title: string;\n description: string;\n createdAt: string;\n}\n\ninterface DataListProps {\n fetchItems: () => Promise<Item[]>;\n onItemPress?: (item: Item) => void;\n}\n\nexport function DataList({ fetchItems, onItemPress }: DataListProps) {\n const [items, setItems] = useState<Item[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadData = useCallback(async (showLoader = true) => {\n if (showLoader) setIsLoading(true);\n setError(null);\n\n try {\n const data = await fetchItems();\n setItems(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data');\n } finally {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }, [fetchItems]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n const handleRefresh = () => {\n setIsRefreshing(true);\n loadData(false);\n };\n\n // Loading state\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n <Text style={{ marginTop: 16 }}>Loading...</Text>\n </View>\n );\n }\n\n // Error state\n if (error) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n <Icon name=\"alert-circle\" size={48} intent=\"danger\" />\n <Text variant=\"title\" style={{ marginTop: 16 }}>Something went wrong</Text>\n <Text style={{ textAlign: 'center', marginTop: 8, opacity: 0.7 }}>\n {error}\n </Text>\n <Button onPress={() => loadData()} style={{ marginTop: 24 }}>\n Try Again\n </Button>\n </View>\n );\n }\n\n // Empty state\n if (items.length === 0) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n <Icon name=\"inbox\" size={48} style={{ opacity: 0.5 }} />\n <Text variant=\"title\" style={{ marginTop: 16 }}>No items yet</Text>\n <Text style={{ textAlign: 'center', marginTop: 8, opacity: 0.7 }}>\n Pull down to refresh or check back later\n </Text>\n </View>\n );\n }\n\n return (\n <FlatList\n data={items}\n keyExtractor={(item) => item.id}\n contentContainerStyle={{ padding: 16, gap: 12 }}\n refreshControl={\n <RefreshControl\n refreshing={isRefreshing}\n onRefresh={handleRefresh}\n />\n }\n renderItem={({ item }) => (\n <Card\n onPress={() => onItemPress?.(item)}\n style={{ padding: 16 }}\n >\n <Text variant=\"title\">{item.title}</Text>\n <Text style={{ marginTop: 4, opacity: 0.7 }}>\n {item.description}\n </Text>\n <Text size=\"sm\" style={{ marginTop: 8, opacity: 0.5 }}>\n {new Date(item.createdAt).toLocaleDateString()}\n </Text>\n </Card>\n )}\n />\n );\n}\n\n// Usage example\nfunction MyScreen() {\n const fetchItems = async () => {\n const response = await fetch('/api/items');\n return response.json();\n };\n\n return (\n <DataList\n fetchItems={fetchItems}\n onItemPress={(item) => console.log('Selected:', item)}\n />\n );\n}`,\n explanation: `This data list component handles:\n- Initial loading state with spinner\n- Pull-to-refresh functionality\n- Error state with retry button\n- Empty state with helpful message\n- Efficient FlatList rendering for large lists`,\n tips: [\n \"Add pagination with onEndReached for large datasets\",\n \"Use skeleton loading for smoother perceived performance\",\n \"Consider optimistic updates for better UX\",\n ],\n relatedRecipes: [\"search-filter\", \"infinite-scroll\"],\n },\n\n \"search-filter\": {\n name: \"Search with Filters\",\n description: \"Search input with filter chips and debounced search\",\n category: \"data\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useEffect, useMemo } from 'react';\nimport { ScrollView } from 'react-native';\nimport { View, Input, Chip, Text, Icon } from '@idealyst/components';\n\ninterface SearchFilterProps<T> {\n data: T[];\n searchKeys: (keyof T)[];\n filterOptions: { key: string; label: string; values: string[] }[];\n renderItem: (item: T) => React.ReactNode;\n placeholder?: string;\n}\n\n// Debounce hook\nfunction useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nexport function SearchFilter<T extends Record<string, any>>({\n data,\n searchKeys,\n filterOptions,\n renderItem,\n placeholder = 'Search...',\n}: SearchFilterProps<T>) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeFilters, setActiveFilters] = useState<Record<string, string[]>>({});\n\n const debouncedQuery = useDebounce(searchQuery, 300);\n\n const toggleFilter = (key: string, value: string) => {\n setActiveFilters((prev) => {\n const current = prev[key] || [];\n const updated = current.includes(value)\n ? current.filter((v) => v !== value)\n : [...current, value];\n\n return { ...prev, [key]: updated };\n });\n };\n\n const clearFilters = () => {\n setActiveFilters({});\n setSearchQuery('');\n };\n\n const filteredData = useMemo(() => {\n let result = data;\n\n // Apply search\n if (debouncedQuery) {\n const query = debouncedQuery.toLowerCase();\n result = result.filter((item) =>\n searchKeys.some((key) =>\n String(item[key]).toLowerCase().includes(query)\n )\n );\n }\n\n // Apply filters\n for (const [key, values] of Object.entries(activeFilters)) {\n if (values.length > 0) {\n result = result.filter((item) => values.includes(String(item[key])));\n }\n }\n\n return result;\n }, [data, debouncedQuery, activeFilters, searchKeys]);\n\n const hasActiveFilters =\n searchQuery || Object.values(activeFilters).some((v) => v.length > 0);\n\n return (\n <View style={{ flex: 1 }}>\n {/* Search Input */}\n <View style={{ padding: 16 }}>\n <Input\n placeholder={placeholder}\n value={searchQuery}\n onChangeText={setSearchQuery}\n leftIcon=\"magnify\"\n rightIcon={searchQuery ? 'close' : undefined}\n onRightIconPress={() => setSearchQuery('')}\n />\n </View>\n\n {/* Filter Chips */}\n {filterOptions.map((filter) => (\n <View key={filter.key} style={{ paddingHorizontal: 16, marginBottom: 12 }}>\n <Text size=\"sm\" style={{ marginBottom: 8, opacity: 0.7 }}>\n {filter.label}\n </Text>\n <ScrollView horizontal showsHorizontalScrollIndicator={false}>\n <View style={{ flexDirection: 'row', gap: 8 }}>\n {filter.values.map((value) => (\n <Chip\n key={value}\n selected={(activeFilters[filter.key] || []).includes(value)}\n onPress={() => toggleFilter(filter.key, value)}\n >\n {value}\n </Chip>\n ))}\n </View>\n </ScrollView>\n </View>\n ))}\n\n {/* Results Header */}\n <View style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 8,\n }}>\n <Text size=\"sm\" style={{ opacity: 0.7 }}>\n {filteredData.length} result{filteredData.length !== 1 ? 's' : ''}\n </Text>\n {hasActiveFilters && (\n <Chip onPress={clearFilters} size=\"sm\">\n <Icon name=\"close\" size={14} /> Clear all\n </Chip>\n )}\n </View>\n\n {/* Results */}\n <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>\n {filteredData.length === 0 ? (\n <View style={{ alignItems: 'center', paddingVertical: 32 }}>\n <Icon name=\"magnify-close\" size={48} style={{ opacity: 0.5 }} />\n <Text style={{ marginTop: 16 }}>No results found</Text>\n </View>\n ) : (\n filteredData.map((item, index) => (\n <View key={index}>{renderItem(item)}</View>\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n\n// Usage example\nconst products = [\n { id: '1', name: 'iPhone', category: 'Electronics', price: 999 },\n { id: '2', name: 'MacBook', category: 'Electronics', price: 1999 },\n { id: '3', name: 'Desk Chair', category: 'Furniture', price: 299 },\n];\n\nfunction ProductSearch() {\n return (\n <SearchFilter\n data={products}\n searchKeys={['name']}\n filterOptions={[\n { key: 'category', label: 'Category', values: ['Electronics', 'Furniture'] },\n ]}\n renderItem={(product) => (\n <Card>\n <Text>{product.name}</Text>\n <Text>\\${product.price}</Text>\n </Card>\n )}\n />\n );\n}`,\n explanation: `This search and filter component provides:\n- Debounced search input (300ms delay)\n- Multiple filter categories with chips\n- Combined search + filter logic\n- Clear all filters button\n- Result count display\n- Empty state handling`,\n tips: [\n \"Add URL query params sync for shareable filtered views\",\n \"Consider server-side filtering for large datasets\",\n \"Add sort options alongside filters\",\n ],\n relatedRecipes: [\"data-list\", \"infinite-scroll\"],\n },\n\n \"modal-confirmation\": {\n name: \"Confirmation Dialog\",\n description: \"Reusable confirmation modal for destructive actions\",\n category: \"layout\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\"],\n code: `import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { Dialog, Button, Text, View, Icon } from '@idealyst/components';\n\ninterface ConfirmOptions {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n intent?: 'danger' | 'warning' | 'primary';\n icon?: string;\n}\n\ninterface ConfirmContextType {\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n}\n\nconst ConfirmContext = createContext<ConfirmContextType | null>(null);\n\nexport function ConfirmProvider({ children }: { children: React.ReactNode }) {\n const [isOpen, setIsOpen] = useState(false);\n const [options, setOptions] = useState<ConfirmOptions | null>(null);\n const [resolveRef, setResolveRef] = useState<((value: boolean) => void) | null>(null);\n\n const confirm = useCallback((opts: ConfirmOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n setOptions(opts);\n setResolveRef(() => resolve);\n setIsOpen(true);\n });\n }, []);\n\n const handleClose = (confirmed: boolean) => {\n setIsOpen(false);\n resolveRef?.(confirmed);\n // Clean up after animation\n setTimeout(() => {\n setOptions(null);\n setResolveRef(null);\n }, 300);\n };\n\n return (\n <ConfirmContext.Provider value={{ confirm }}>\n {children}\n\n <Dialog open={isOpen} onClose={() => handleClose(false)}>\n {options && (\n <View style={{ padding: 24, alignItems: 'center' }}>\n {options.icon && (\n <Icon\n name={options.icon}\n size={48}\n intent={options.intent || 'danger'}\n style={{ marginBottom: 16 }}\n />\n )}\n\n <Text variant=\"headline\" style={{ textAlign: 'center' }}>\n {options.title}\n </Text>\n\n <Text style={{ textAlign: 'center', marginTop: 8, opacity: 0.7 }}>\n {options.message}\n </Text>\n\n <View style={{\n flexDirection: 'row',\n gap: 12,\n marginTop: 24,\n width: '100%',\n }}>\n <Button\n type=\"outlined\"\n onPress={() => handleClose(false)}\n style={{ flex: 1 }}\n >\n {options.cancelLabel || 'Cancel'}\n </Button>\n\n <Button\n intent={options.intent || 'danger'}\n onPress={() => handleClose(true)}\n style={{ flex: 1 }}\n >\n {options.confirmLabel || 'Confirm'}\n </Button>\n </View>\n </View>\n )}\n </Dialog>\n </ConfirmContext.Provider>\n );\n}\n\nexport function useConfirm() {\n const context = useContext(ConfirmContext);\n if (!context) {\n throw new Error('useConfirm must be used within ConfirmProvider');\n }\n return context.confirm;\n}\n\n// Usage example\nfunction DeleteButton({ onDelete }: { onDelete: () => void }) {\n const confirm = useConfirm();\n\n const handleDelete = async () => {\n const confirmed = await confirm({\n title: 'Delete Item?',\n message: 'This action cannot be undone. Are you sure you want to delete this item?',\n confirmLabel: 'Delete',\n cancelLabel: 'Keep',\n intent: 'danger',\n icon: 'delete',\n });\n\n if (confirmed) {\n onDelete();\n }\n };\n\n return (\n <Button intent=\"danger\" type=\"outlined\" onPress={handleDelete}>\n Delete\n </Button>\n );\n}\n\n// Wrap your app\nfunction App() {\n return (\n <ConfirmProvider>\n <MyApp />\n </ConfirmProvider>\n );\n}`,\n explanation: `This confirmation dialog system provides:\n- Async/await API for easy use: \\`if (await confirm({...})) { ... }\\`\n- Customizable title, message, buttons, and icon\n- Intent-based styling (danger, warning, primary)\n- Promise-based resolution\n- Clean context-based architecture`,\n tips: [\n \"Use danger intent for destructive actions\",\n \"Keep messages concise and actionable\",\n \"Consider adding a 'Don't ask again' checkbox for repeated actions\",\n ],\n relatedRecipes: [\"toast-notifications\"],\n },\n\n \"toast-notifications\": {\n name: \"Toast Notifications\",\n description: \"Temporary notification messages that auto-dismiss\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { Animated, Pressable } from 'react-native';\nimport { View, Text, Icon } from '@idealyst/components';\n\ntype ToastType = 'success' | 'danger' | 'warning' | 'info';\n\ninterface Toast {\n id: string;\n type: ToastType;\n message: string;\n duration?: number;\n}\n\ninterface ToastContextType {\n showToast: (type: ToastType, message: string, duration?: number) => void;\n success: (message: string) => void;\n danger: (message: string) => void;\n warning: (message: string) => void;\n info: (message: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextType | null>(null);\n\nconst toastConfig: Record<ToastType, { icon: string; intent: string }> = {\n success: { icon: 'check-circle', intent: 'success' },\n danger: { icon: 'alert-circle', intent: 'danger' },\n warning: { icon: 'alert', intent: 'warning' },\n info: { icon: 'information', intent: 'primary' },\n};\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const showToast = useCallback((type: ToastType, message: string, duration = 3000) => {\n const id = Date.now().toString();\n const toast: Toast = { id, type, message, duration };\n\n setToasts((prev) => [...prev, toast]);\n\n if (duration > 0) {\n setTimeout(() => removeToast(id), duration);\n }\n }, [removeToast]);\n\n const contextValue: ToastContextType = {\n showToast,\n success: (msg) => showToast('success', msg),\n danger: (msg) => showToast('danger', msg),\n warning: (msg) => showToast('warning', msg),\n info: (msg) => showToast('info', msg),\n };\n\n return (\n <ToastContext.Provider value={contextValue}>\n {children}\n\n {/* Toast Container */}\n <View\n style={{\n position: 'absolute',\n top: 60,\n left: 16,\n right: 16,\n zIndex: 9999,\n gap: 8,\n }}\n pointerEvents=\"box-none\"\n >\n {toasts.map((toast) => (\n <ToastItem\n key={toast.id}\n toast={toast}\n onDismiss={() => removeToast(toast.id)}\n />\n ))}\n </View>\n </ToastContext.Provider>\n );\n}\n\nfunction ToastItem({ toast, onDismiss }: { toast: Toast; onDismiss: () => void }) {\n const fadeAnim = React.useRef(new Animated.Value(0)).current;\n const config = toastConfig[toast.type];\n\n React.useEffect(() => {\n Animated.timing(fadeAnim, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }).start();\n }, []);\n\n return (\n <Animated.View style={{ opacity: fadeAnim, transform: [{ translateY: fadeAnim.interpolate({\n inputRange: [0, 1],\n outputRange: [-20, 0],\n }) }] }}>\n <Pressable onPress={onDismiss}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: '#1a1a1a',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n }}\n >\n <Icon name={config.icon} size={20} intent={config.intent as any} />\n <Text style={{ flex: 1, color: '#fff' }}>{toast.message}</Text>\n <Icon name=\"close\" size={16} style={{ opacity: 0.5 }} />\n </View>\n </Pressable>\n </Animated.View>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within ToastProvider');\n }\n return context;\n}\n\n// Usage example\nfunction SaveButton() {\n const toast = useToast();\n const [isSaving, setIsSaving] = useState(false);\n\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await saveData();\n toast.success('Changes saved successfully!');\n } catch (error) {\n toast.error('Failed to save changes. Please try again.');\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <Button onPress={handleSave} loading={isSaving}>\n Save\n </Button>\n );\n}\n\n// Wrap your app\nfunction App() {\n return (\n <ToastProvider>\n <MyApp />\n </ToastProvider>\n );\n}`,\n explanation: `This toast notification system provides:\n- Simple API: \\`toast.success('Message')\\`\n- Four types: success, error, warning, info\n- Auto-dismiss with configurable duration\n- Tap to dismiss\n- Animated entrance\n- Stacking multiple toasts`,\n tips: [\n \"Use success for completed actions, error for failures\",\n \"Keep messages under 50 characters for readability\",\n \"Don't show toasts for every action - use sparingly\",\n ],\n relatedRecipes: [\"modal-confirmation\"],\n },\n\n \"form-with-validation\": {\n name: \"Form with Validation\",\n description: \"Multi-field form with real-time validation and error handling\",\n category: \"forms\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState } from 'react';\nimport { ScrollView } from 'react-native';\nimport {\n View, Text, Input, Select, Checkbox, Button, Card\n} from '@idealyst/components';\n\n// Validation rules\ntype ValidationRule<T> = {\n validate: (value: T, formData: FormData) => boolean;\n message: string;\n};\n\ninterface FormData {\n name: string;\n email: string;\n phone: string;\n country: string;\n message: string;\n subscribe: boolean;\n}\n\nconst validationRules: Partial<Record<keyof FormData, ValidationRule<any>[]>> = {\n name: [\n { validate: (v) => v.trim().length > 0, message: 'Name is required' },\n { validate: (v) => v.trim().length >= 2, message: 'Name must be at least 2 characters' },\n ],\n email: [\n { validate: (v) => v.length > 0, message: 'Email is required' },\n { validate: (v) => /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(v), message: 'Invalid email format' },\n ],\n phone: [\n { validate: (v) => !v || /^[+]?[0-9\\\\s-]{10,}$/.test(v), message: 'Invalid phone number' },\n ],\n country: [\n { validate: (v) => v.length > 0, message: 'Please select a country' },\n ],\n message: [\n { validate: (v) => v.length > 0, message: 'Message is required' },\n { validate: (v) => v.length >= 10, message: 'Message must be at least 10 characters' },\n ],\n};\n\nexport function ContactForm({ onSubmit }: { onSubmit: (data: FormData) => Promise<void> }) {\n const [formData, setFormData] = useState<FormData>({\n name: '',\n email: '',\n phone: '',\n country: '',\n message: '',\n subscribe: false,\n });\n\n const [errors, setErrors] = useState<Partial<Record<keyof FormData, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof FormData, boolean>>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const validateField = (field: keyof FormData, value: any): string | undefined => {\n const rules = validationRules[field];\n if (!rules) return undefined;\n\n for (const rule of rules) {\n if (!rule.validate(value, formData)) {\n return rule.message;\n }\n }\n return undefined;\n };\n\n const validateAll = (): boolean => {\n const newErrors: typeof errors = {};\n let isValid = true;\n\n for (const field of Object.keys(validationRules) as (keyof FormData)[]) {\n const error = validateField(field, formData[field]);\n if (error) {\n newErrors[field] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n };\n\n const handleChange = (field: keyof FormData, value: any) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n\n // Validate on change if field was touched\n if (touched[field]) {\n const error = validateField(field, value);\n setErrors((prev) => ({ ...prev, [field]: error }));\n }\n };\n\n const handleBlur = (field: keyof FormData) => {\n setTouched((prev) => ({ ...prev, [field]: true }));\n const error = validateField(field, formData[field]);\n setErrors((prev) => ({ ...prev, [field]: error }));\n };\n\n const handleSubmit = async () => {\n // Mark all fields as touched\n const allTouched = Object.keys(formData).reduce(\n (acc, key) => ({ ...acc, [key]: true }),\n {}\n );\n setTouched(allTouched);\n\n if (!validateAll()) return;\n\n setIsSubmitting(true);\n try {\n await onSubmit(formData);\n } catch (error) {\n setErrors({\n submit: error instanceof Error ? error.message : 'Submission failed'\n } as any);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <ScrollView>\n <Card padding=\"lg\">\n <Text variant=\"headline\" style={{ marginBottom: 24 }}>\n Contact Us\n </Text>\n\n <View style={{ gap: 16 }}>\n <Input\n label=\"Name *\"\n placeholder=\"Your full name\"\n value={formData.name}\n onChangeText={(v) => handleChange('name', v)}\n onBlur={() => handleBlur('name')}\n error={touched.name ? errors.name : undefined}\n />\n\n <Input\n label=\"Email *\"\n placeholder=\"you@example.com\"\n value={formData.email}\n onChangeText={(v) => handleChange('email', v)}\n onBlur={() => handleBlur('email')}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n error={touched.email ? errors.email : undefined}\n />\n\n <Input\n label=\"Phone\"\n placeholder=\"+1 234 567 8900\"\n value={formData.phone}\n onChangeText={(v) => handleChange('phone', v)}\n onBlur={() => handleBlur('phone')}\n keyboardType=\"phone-pad\"\n error={touched.phone ? errors.phone : undefined}\n />\n\n <Select\n label=\"Country *\"\n placeholder=\"Select your country\"\n value={formData.country}\n onChange={(v) => handleChange('country', v)}\n options={[\n { label: 'United States', value: 'us' },\n { label: 'United Kingdom', value: 'uk' },\n { label: 'Canada', value: 'ca' },\n { label: 'Australia', value: 'au' },\n { label: 'Other', value: 'other' },\n ]}\n error={touched.country ? errors.country : undefined}\n />\n\n <Input\n label=\"Message *\"\n placeholder=\"How can we help you?\"\n value={formData.message}\n onChangeText={(v) => handleChange('message', v)}\n onBlur={() => handleBlur('message')}\n multiline\n numberOfLines={4}\n error={touched.message ? errors.message : undefined}\n />\n\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n <Checkbox\n checked={formData.subscribe}\n onChange={(v) => handleChange('subscribe', v)}\n />\n <Text>Subscribe to our newsletter</Text>\n </View>\n\n <Button\n onPress={handleSubmit}\n loading={isSubmitting}\n disabled={isSubmitting}\n style={{ marginTop: 8 }}\n >\n Send Message\n </Button>\n </View>\n </Card>\n </ScrollView>\n );\n}`,\n explanation: `This form demonstrates:\n- Field-level validation with custom rules\n- Validation on blur (after first touch)\n- Real-time validation after field is touched\n- Full form validation on submit\n- Error display with touched state tracking\n- Loading state during submission`,\n tips: [\n \"Consider using a form library like react-hook-form for complex forms\",\n \"Add success state/message after submission\",\n \"Implement autosave for long forms\",\n ],\n relatedRecipes: [\"login-form\", \"signup-form\"],\n },\n\n \"image-upload\": {\n name: \"Image Upload\",\n description: \"Image picker with preview, crop option, and upload progress\",\n category: \"media\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/camera\"],\n code: `import React, { useState } from 'react';\nimport { Image } from 'react-native';\nimport { View, Text, Button, Card, Icon, Progress } from '@idealyst/components';\n// Note: You'll need expo-image-picker or react-native-image-picker\n\ninterface ImageUploadProps {\n onUpload: (uri: string) => Promise<string>; // Returns uploaded URL\n currentImage?: string;\n}\n\nexport function ImageUpload({ onUpload, currentImage }: ImageUploadProps) {\n const [imageUri, setImageUri] = useState<string | null>(currentImage || null);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const pickImage = async () => {\n try {\n // Using expo-image-picker as example\n const result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n allowsEditing: true,\n aspect: [1, 1],\n quality: 0.8,\n });\n\n if (!result.canceled && result.assets[0]) {\n setImageUri(result.assets[0].uri);\n setError(null);\n }\n } catch (err) {\n setError('Failed to pick image');\n }\n };\n\n const takePhoto = async () => {\n try {\n const result = await ImagePicker.launchCameraAsync({\n allowsEditing: true,\n aspect: [1, 1],\n quality: 0.8,\n });\n\n if (!result.canceled && result.assets[0]) {\n setImageUri(result.assets[0].uri);\n setError(null);\n }\n } catch (err) {\n setError('Failed to take photo');\n }\n };\n\n const handleUpload = async () => {\n if (!imageUri) return;\n\n setIsUploading(true);\n setUploadProgress(0);\n setError(null);\n\n try {\n // Simulate upload progress\n const progressInterval = setInterval(() => {\n setUploadProgress((prev) => Math.min(prev + 10, 90));\n }, 200);\n\n const uploadedUrl = await onUpload(imageUri);\n\n clearInterval(progressInterval);\n setUploadProgress(100);\n setImageUri(uploadedUrl);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Upload failed');\n } finally {\n setIsUploading(false);\n }\n };\n\n const removeImage = () => {\n setImageUri(null);\n setUploadProgress(0);\n setError(null);\n };\n\n return (\n <Card padding=\"lg\">\n <Text variant=\"title\" style={{ marginBottom: 16 }}>\n Profile Photo\n </Text>\n\n {/* Image Preview */}\n <View style={{ alignItems: 'center', marginBottom: 16 }}>\n {imageUri ? (\n <View style={{ position: 'relative' }}>\n <Image\n source={{ uri: imageUri }}\n style={{\n width: 150,\n height: 150,\n borderRadius: 75,\n }}\n />\n <Pressable\n onPress={removeImage}\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n backgroundColor: 'rgba(0,0,0,0.6)',\n borderRadius: 12,\n padding: 4,\n }}\n >\n <Icon name=\"close\" size={16} color=\"#fff\" />\n </Pressable>\n </View>\n ) : (\n <View\n style={{\n width: 150,\n height: 150,\n borderRadius: 75,\n backgroundColor: 'rgba(0,0,0,0.1)',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Icon name=\"account\" size={64} style={{ opacity: 0.3 }} />\n </View>\n )}\n </View>\n\n {/* Upload Progress */}\n {isUploading && (\n <View style={{ marginBottom: 16 }}>\n <Progress value={uploadProgress} />\n <Text size=\"sm\" style={{ textAlign: 'center', marginTop: 4 }}>\n Uploading... {uploadProgress}%\n </Text>\n </View>\n )}\n\n {/* Error Message */}\n {error && (\n <Text intent=\"danger\" style={{ textAlign: 'center', marginBottom: 16 }}>\n {error}\n </Text>\n )}\n\n {/* Action Buttons */}\n <View style={{ gap: 12 }}>\n <View style={{ flexDirection: 'row', gap: 12 }}>\n <Button\n type=\"outlined\"\n onPress={pickImage}\n disabled={isUploading}\n style={{ flex: 1 }}\n >\n <Icon name=\"image\" size={18} /> Gallery\n </Button>\n <Button\n type=\"outlined\"\n onPress={takePhoto}\n disabled={isUploading}\n style={{ flex: 1 }}\n >\n <Icon name=\"camera\" size={18} /> Camera\n </Button>\n </View>\n\n {imageUri && !imageUri.startsWith('http') && (\n <Button\n onPress={handleUpload}\n loading={isUploading}\n disabled={isUploading}\n >\n Upload Photo\n </Button>\n )}\n </View>\n </Card>\n );\n}\n\n// Usage\nfunction ProfileScreen() {\n const uploadImage = async (uri: string): Promise<string> => {\n // Upload to your server/cloud storage\n const formData = new FormData();\n formData.append('image', {\n uri,\n type: 'image/jpeg',\n name: 'photo.jpg',\n } as any);\n\n const response = await fetch('/api/upload', {\n method: 'POST',\n body: formData,\n });\n\n const { url } = await response.json();\n return url;\n };\n\n return (\n <ImageUpload\n currentImage=\"https://example.com/current-avatar.jpg\"\n onUpload={uploadImage}\n />\n );\n}`,\n explanation: `This image upload component provides:\n- Pick from gallery or take photo\n- Image preview with circular crop\n- Upload progress indicator\n- Error handling\n- Remove/replace image option\n- Works with any backend upload API`,\n tips: [\n \"Add image compression before upload to reduce size\",\n \"Consider using a CDN for image hosting\",\n \"Implement retry logic for failed uploads\",\n ],\n relatedRecipes: [\"form-with-validation\"],\n },\n\n \"web-stack-layout\": {\n name: \"Web Stack Layout\",\n description: \"Stack layout for web that mimics native stack navigator with header, back button, and title\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps, NavigatorOptions } from '@idealyst/navigation';\n\n/**\n * Web Stack Layout - mimics native stack navigator header\n *\n * Features:\n * - Header with title (from options.headerTitle)\n * - Automatic back button when canGoBack() is true\n * - Left and right header slots\n * - Hide header with headerShown: false\n */\nexport function WebStackLayout({ options }: StackLayoutProps) {\n const { canGoBack, goBack } = useNavigator();\n\n const showHeader = options?.headerShown !== false;\n const showBackButton = options?.headerBackVisible !== false && canGoBack();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Header bar - like native stack header */}\n {showHeader && (\n <View style={{\n height: 56,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 8,\n backgroundColor: '#ffffff',\n borderBottomWidth: 1,\n borderBottomColor: '#e0e0e0',\n // Web shadow\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }}>\n {/* Back button */}\n {showBackButton && (\n <Pressable\n onPress={goBack}\n style={{\n width: 40,\n height: 40,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 20,\n }}\n >\n <Icon name=\"arrow-left\" size={24} />\n </Pressable>\n )}\n\n {/* Left header slot */}\n {options?.headerLeft && (\n <View style={{ marginLeft: 8 }}>\n {renderHeaderComponent(options.headerLeft)}\n </View>\n )}\n\n {/* Title */}\n <View style={{ flex: 1, marginHorizontal: 8 }}>\n {typeof options?.headerTitle === 'string' ? (\n <Text variant=\"title\" numberOfLines={1}>\n {options.headerTitle}\n </Text>\n ) : options?.headerTitle ? (\n renderHeaderComponent(options.headerTitle)\n ) : null}\n </View>\n\n {/* Right header slot */}\n {options?.headerRight && (\n <View>\n {renderHeaderComponent(options.headerRight)}\n </View>\n )}\n </View>\n )}\n\n {/* Content area - Outlet renders child routes */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\n// Helper to render header components (can be React element or function)\nfunction renderHeaderComponent(\n component: React.ComponentType | React.ReactElement | undefined\n) {\n if (!component) return null;\n if (typeof component === 'function') {\n const Component = component;\n return <Component />;\n }\n return component;\n}\n\n// Usage in router config:\n// {\n// path: \"/\",\n// type: 'navigator',\n// layout: 'stack',\n// layoutComponent: WebStackLayout,\n// options: {\n// headerTitle: \"My App\",\n// headerRight: <UserMenu />,\n// },\n// routes: [...]\n// }`,\n explanation: `This layout mimics the native stack navigator header:\n\n**What it provides:**\n- Fixed header bar at the top (56px height like native)\n- Automatic back button that appears when canGoBack() returns true\n- headerTitle renders as text or custom component\n- headerLeft and headerRight slots for custom actions\n- headerShown: false hides the entire header\n- headerBackVisible: false hides just the back button\n\n**Key insight:** On web, canGoBack() checks if there's a parent route in the hierarchy, not browser history. This matches the native behavior where back goes \"up\" the navigation stack.`,\n tips: [\n \"Use options.headerShown: false for fullscreen content like media players\",\n \"The back button appears automatically - no need to manage visibility\",\n \"headerRight is great for action buttons, user menus, or search\",\n \"Wrap your entire app router with this for consistent headers\",\n ],\n relatedRecipes: [\"web-tab-layout\", \"web-drawer-layout\", \"responsive-navigation\"],\n },\n\n \"web-tab-layout\": {\n name: \"Web Tab Layout\",\n description: \"Tab layout for web that mimics native bottom tab navigator with icons, labels, and badges\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon, Badge } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { TabLayoutProps } from '@idealyst/navigation';\n\n/**\n * Web Tab Layout - mimics native bottom tab navigator\n *\n * Features:\n * - Bottom tab bar (like iOS/Android)\n * - Icons from tabBarIcon option\n * - Labels from tabBarLabel option\n * - Badge counts from tabBarBadge option\n * - Active state highlighting\n */\nexport function WebTabLayout({ routes, currentPath }: TabLayoutProps) {\n const { navigate } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Content area - takes remaining space */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n\n {/* Bottom tab bar */}\n <View style={{\n height: 56,\n flexDirection: 'row',\n backgroundColor: '#ffffff',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n // Safe area padding for mobile web\n paddingBottom: 'env(safe-area-inset-bottom, 0px)',\n }}>\n {routes.map((route) => {\n // Check if this tab is active\n const isActive = currentPath === route.fullPath ||\n currentPath.startsWith(route.fullPath + '/');\n\n const tabOptions = route.options;\n const activeColor = '#007AFF';\n const inactiveColor = '#8E8E93';\n\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 4,\n }}\n >\n {/* Icon container with badge */}\n <View style={{ position: 'relative' }}>\n {tabOptions?.tabBarIcon?.({\n focused: isActive,\n color: isActive ? activeColor : inactiveColor,\n size: 24,\n })}\n\n {/* Badge */}\n {tabOptions?.tabBarBadge != null && (\n <View style={{\n position: 'absolute',\n top: -4,\n right: -12,\n minWidth: 18,\n height: 18,\n borderRadius: 9,\n backgroundColor: '#FF3B30',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 4,\n }}>\n <Text style={{ color: '#fff', fontSize: 10, fontWeight: '600' }}>\n {typeof tabOptions.tabBarBadge === 'number' && tabOptions.tabBarBadge > 99\n ? '99+'\n : tabOptions.tabBarBadge}\n </Text>\n </View>\n )}\n </View>\n\n {/* Label */}\n {tabOptions?.tabBarLabel && (\n <Text\n size=\"xs\"\n style={{\n marginTop: 2,\n color: isActive ? activeColor : inactiveColor,\n fontWeight: isActive ? '600' : '400',\n }}\n >\n {tabOptions.tabBarLabel}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\n// Usage in router config:\n// {\n// path: \"/main\",\n// type: 'navigator',\n// layout: 'tab',\n// layoutComponent: WebTabLayout,\n// routes: [\n// {\n// path: \"home\",\n// type: 'screen',\n// component: HomeScreen,\n// options: {\n// tabBarLabel: \"Home\",\n// tabBarIcon: ({ focused, color }) => (\n// <Icon name={focused ? \"home\" : \"home-outline\"} color={color} />\n// ),\n// },\n// },\n// {\n// path: \"notifications\",\n// type: 'screen',\n// component: NotificationsScreen,\n// options: {\n// tabBarLabel: \"Notifications\",\n// tabBarIcon: ({ color }) => <Icon name=\"bell\" color={color} />,\n// tabBarBadge: 5,\n// },\n// },\n// ],\n// }`,\n explanation: `This layout mimics the native bottom tab bar:\n\n**What routes provide:**\n- \\`route.fullPath\\` - The complete path for navigation\n- \\`route.options.tabBarIcon\\` - Function that receives { focused, color, size }\n- \\`route.options.tabBarLabel\\` - Text label for the tab\n- \\`route.options.tabBarBadge\\` - Badge count (number or string)\n\n**Active state detection:**\n\\`currentPath === route.fullPath\\` - Exact match for active state\nOr use \\`startsWith\\` for nested routes under a tab\n\n**Platform parity:**\n- 56px tab bar height matches iOS/Android\n- Icon + label layout matches native patterns\n- Badge styling matches iOS notification badges\n- Safe area inset for mobile web browsers`,\n tips: [\n \"Use outlined/filled icon variants for focused state (home-outline vs home)\",\n \"Keep tab count to 3-5 for best usability\",\n \"Badge counts over 99 should show '99+' to fit\",\n \"Consider hiding the tab bar on detail screens with conditional rendering\",\n ],\n relatedRecipes: [\"web-stack-layout\", \"tab-navigation\", \"responsive-navigation\"],\n },\n\n \"web-drawer-layout\": {\n name: \"Web Drawer/Sidebar Layout\",\n description: \"Sidebar layout for web that provides persistent navigation menu with collapsible support\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React, { useState } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon, Avatar } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\ninterface DrawerLayoutOptions {\n expandedWidth?: number;\n collapsedWidth?: number;\n initiallyCollapsed?: boolean;\n}\n\n/**\n * Web Drawer Layout - persistent sidebar navigation\n *\n * Features:\n * - Collapsible sidebar with smooth animation\n * - Active route highlighting\n * - Icon + label navigation items\n * - User profile section\n * - Works with any navigator layout type\n */\nexport function WebDrawerLayout({\n routes,\n currentPath,\n options,\n}: StackLayoutProps & { drawerOptions?: DrawerLayoutOptions }) {\n const { navigate } = useNavigator();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n const expandedWidth = 240;\n const collapsedWidth = 64;\n const sidebarWidth = isCollapsed ? collapsedWidth : expandedWidth;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n {/* Sidebar */}\n <View style={{\n width: sidebarWidth,\n backgroundColor: '#1a1a2e',\n transition: 'width 0.2s ease',\n overflow: 'hidden',\n }}>\n {/* Logo / App Header */}\n <View style={{\n height: 64,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n borderBottomWidth: 1,\n borderBottomColor: 'rgba(255,255,255,0.1)',\n }}>\n <Icon name=\"rocket\" size={28} color=\"#fff\" />\n {!isCollapsed && (\n <Text\n variant=\"title\"\n style={{ color: '#fff', marginLeft: 12 }}\n >\n {options?.headerTitle || 'My App'}\n </Text>\n )}\n </View>\n\n {/* Navigation Items */}\n <View style={{ flex: 1, paddingVertical: 8 }}>\n {routes.map((route) => {\n const isActive = currentPath === route.fullPath ||\n currentPath.startsWith(route.fullPath + '/');\n\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 16,\n marginHorizontal: 8,\n marginVertical: 2,\n borderRadius: 8,\n backgroundColor: isActive ? 'rgba(255,255,255,0.15)' : 'transparent',\n }}\n >\n <Icon\n name={route.options?.icon || 'circle'}\n size={24}\n color={isActive ? '#fff' : 'rgba(255,255,255,0.6)'}\n />\n {!isCollapsed && (\n <Text\n style={{\n marginLeft: 12,\n color: isActive ? '#fff' : 'rgba(255,255,255,0.6)',\n fontWeight: isActive ? '600' : '400',\n }}\n >\n {route.options?.title || route.path}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n\n {/* User Section (optional) */}\n <View style={{\n padding: 16,\n borderTopWidth: 1,\n borderTopColor: 'rgba(255,255,255,0.1)',\n }}>\n <Pressable\n style={{ flexDirection: 'row', alignItems: 'center' }}\n onPress={() => navigate({ path: '/profile' })}\n >\n <Avatar size=\"sm\" />\n {!isCollapsed && (\n <View style={{ marginLeft: 12 }}>\n <Text style={{ color: '#fff', fontWeight: '500' }}>John Doe</Text>\n <Text size=\"xs\" style={{ color: 'rgba(255,255,255,0.5)' }}>\n View profile\n </Text>\n </View>\n )}\n </Pressable>\n </View>\n\n {/* Collapse Toggle */}\n <Pressable\n onPress={() => setIsCollapsed(!isCollapsed)}\n style={{\n padding: 16,\n borderTopWidth: 1,\n borderTopColor: 'rgba(255,255,255,0.1)',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: isCollapsed ? 'center' : 'flex-start',\n }}\n >\n <Icon\n name={isCollapsed ? 'chevron-right' : 'chevron-left'}\n size={20}\n color=\"rgba(255,255,255,0.6)\"\n />\n {!isCollapsed && (\n <Text style={{ marginLeft: 12, color: 'rgba(255,255,255,0.6)' }}>\n Collapse\n </Text>\n )}\n </Pressable>\n </View>\n\n {/* Main Content */}\n <View style={{ flex: 1, backgroundColor: '#f5f5f5' }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\n// Usage:\n// {\n// path: \"/\",\n// type: 'navigator',\n// layout: 'drawer', // or 'stack' - layout type doesn't matter for web\n// layoutComponent: WebDrawerLayout,\n// options: { headerTitle: \"Dashboard\" },\n// routes: [\n// { path: \"home\", component: Home, options: { title: \"Home\", icon: \"home\" } },\n// { path: \"users\", component: Users, options: { title: \"Users\", icon: \"account-group\" } },\n// { path: \"settings\", component: Settings, options: { title: \"Settings\", icon: \"cog\" } },\n// ],\n// }`,\n explanation: `This sidebar layout is ideal for dashboards and admin panels:\n\n**Route options used:**\n- \\`route.options.title\\` - Menu item label\n- \\`route.options.icon\\` - Material Design Icon name\n\n**Features:**\n- Collapsible sidebar with smooth width transition\n- Active state with background highlight\n- User profile section at bottom\n- Collapse toggle button\n- Dark theme (easily customizable)\n\n**Why this differs from mobile:**\nOn native, a drawer slides over content. On web, a persistent sidebar is more common and user-friendly. This layout provides the web-appropriate pattern while using the same route configuration.`,\n tips: [\n \"Add tooltips on collapsed icons using the title attribute\",\n \"Consider responsive behavior - hide sidebar on mobile, show bottom tabs instead\",\n \"Use the icon option on routes to define sidebar icons\",\n \"The collapse state could be persisted to localStorage\",\n ],\n relatedRecipes: [\"web-stack-layout\", \"responsive-navigation\", \"drawer-navigation\"],\n },\n\n \"responsive-navigation\": {\n name: \"Responsive Navigation Layout\",\n description: \"Layout that switches between bottom tabs on mobile and sidebar on desktop\",\n category: \"navigation\",\n difficulty: \"advanced\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React, { useState, useEffect } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\n// Custom hook for responsive breakpoints\nfunction useResponsive() {\n const [width, setWidth] = useState(\n typeof window !== 'undefined' ? window.innerWidth : 1024\n );\n\n useEffect(() => {\n const handleResize = () => setWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return {\n isMobile: width < 768,\n isTablet: width >= 768 && width < 1024,\n isDesktop: width >= 1024,\n width,\n };\n}\n\n/**\n * Responsive Navigation Layout\n *\n * - Mobile (<768px): Bottom tab bar\n * - Desktop (>=768px): Sidebar navigation\n *\n * Uses the same route configuration for both!\n */\nexport function ResponsiveNavLayout({ routes, currentPath, options }: StackLayoutProps) {\n const { isMobile } = useResponsive();\n\n // Same routes power both layouts\n return isMobile ? (\n <MobileTabBar routes={routes} currentPath={currentPath} />\n ) : (\n <DesktopSidebar routes={routes} currentPath={currentPath} options={options} />\n );\n}\n\n// Mobile: Bottom tab bar\nfunction MobileTabBar({ routes, currentPath }: StackLayoutProps) {\n const { navigate } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n\n <View style={{\n flexDirection: 'row',\n height: 56,\n backgroundColor: '#fff',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n paddingBottom: 'env(safe-area-inset-bottom, 0px)',\n }}>\n {routes.slice(0, 5).map((route) => {\n const isActive = currentPath.startsWith(route.fullPath);\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}\n >\n <Icon\n name={route.options?.icon || 'circle'}\n size={24}\n color={isActive ? '#007AFF' : '#8E8E93'}\n />\n <Text\n size=\"xs\"\n style={{\n marginTop: 2,\n color: isActive ? '#007AFF' : '#8E8E93',\n }}\n >\n {route.options?.tabBarLabel || route.options?.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\n// Desktop: Sidebar\nfunction DesktopSidebar({ routes, currentPath, options }: StackLayoutProps) {\n const { navigate } = useNavigator();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n {/* Sidebar */}\n <View style={{\n width: isCollapsed ? 64 : 240,\n backgroundColor: '#1e1e2d',\n transition: 'width 0.2s',\n }}>\n {/* Header */}\n <View style={{\n height: 64,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n }}>\n <Icon name=\"rocket\" size={28} color=\"#fff\" />\n {!isCollapsed && (\n <Text style={{ color: '#fff', marginLeft: 12, fontWeight: '600' }}>\n {options?.headerTitle || 'App'}\n </Text>\n )}\n </View>\n\n {/* Nav Items */}\n <View style={{ flex: 1, paddingTop: 8 }}>\n {routes.map((route) => {\n const isActive = currentPath.startsWith(route.fullPath);\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 12,\n marginHorizontal: 8,\n marginVertical: 2,\n borderRadius: 8,\n backgroundColor: isActive ? 'rgba(255,255,255,0.1)' : 'transparent',\n }}\n >\n <Icon\n name={route.options?.icon || 'circle'}\n size={24}\n color={isActive ? '#fff' : 'rgba(255,255,255,0.6)'}\n />\n {!isCollapsed && (\n <Text style={{\n marginLeft: 12,\n color: isActive ? '#fff' : 'rgba(255,255,255,0.6)',\n }}>\n {route.options?.title}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n\n {/* Collapse toggle */}\n <Pressable\n onPress={() => setIsCollapsed(!isCollapsed)}\n style={{ padding: 16 }}\n >\n <Icon\n name={isCollapsed ? 'menu' : 'menu-open'}\n size={24}\n color=\"rgba(255,255,255,0.6)\"\n />\n </Pressable>\n </View>\n\n {/* Content */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\n// Usage - works with same routes for both mobile and desktop:\n// {\n// path: \"/\",\n// type: 'navigator',\n// layout: 'stack',\n// layoutComponent: ResponsiveNavLayout,\n// options: { headerTitle: \"My App\" },\n// routes: [\n// {\n// path: \"home\",\n// component: HomeScreen,\n// options: {\n// title: \"Home\", // Used by sidebar\n// tabBarLabel: \"Home\", // Used by tab bar\n// icon: \"home\", // Used by both\n// },\n// },\n// {\n// path: \"search\",\n// component: SearchScreen,\n// options: { title: \"Search\", tabBarLabel: \"Search\", icon: \"magnify\" },\n// },\n// // ... more routes\n// ],\n// }`,\n explanation: `This layout automatically adapts to screen size:\n\n**Breakpoint logic:**\n- Mobile (<768px): Bottom tab bar like native apps\n- Desktop (>=768px): Persistent sidebar like web apps\n\n**Key insight:** The same route configuration powers both layouts! Routes define:\n- \\`title\\` - Used by sidebar menu\n- \\`tabBarLabel\\` - Used by tab bar (falls back to title)\n- \\`icon\\` - Used by both\n\n**Why this matters:**\n1. Write routes once, render appropriately per device\n2. Users get the expected pattern for their device\n3. No need for separate mobile/desktop route configs\n4. Smooth transition when resizing browser\n\n**useResponsive hook:**\nCustom hook that tracks window width and provides boolean flags for breakpoints. Could be extended with more breakpoints or use a library like react-responsive.`,\n tips: [\n \"Limit mobile tabs to 5 items max (slice shown in code)\",\n \"Consider adding a 'More' tab that opens a menu for additional items\",\n \"Persist sidebar collapsed state to localStorage\",\n \"Add transition animation when switching between layouts\",\n \"Consider tablet-specific layout (sidebar + different styling)\",\n ],\n relatedRecipes: [\"web-stack-layout\", \"web-tab-layout\", \"web-drawer-layout\"],\n },\n};\n\n/**\n * Get all recipes grouped by category\n */\nexport function getRecipesByCategory(): Record<string, Recipe[]> {\n const grouped: Record<string, Recipe[]> = {};\n\n for (const recipe of Object.values(recipes)) {\n if (!grouped[recipe.category]) {\n grouped[recipe.category] = [];\n }\n grouped[recipe.category].push(recipe);\n }\n\n return grouped;\n}\n\n/**\n * Get a summary list of all recipes\n */\nexport function getRecipeSummary(): Array<{\n id: string;\n name: string;\n description: string;\n category: string;\n difficulty: string;\n packages: string[];\n}> {\n return Object.entries(recipes).map(([id, recipe]) => ({\n id,\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n}\n\n/**\n * Search recipes by query\n */\nexport function searchRecipes(query: string): Recipe[] {\n const lowerQuery = query.toLowerCase();\n\n return Object.values(recipes).filter(\n (recipe) =>\n recipe.name.toLowerCase().includes(lowerQuery) ||\n recipe.description.toLowerCase().includes(lowerQuery) ||\n recipe.category.toLowerCase().includes(lowerQuery) ||\n recipe.packages.some((p) => p.toLowerCase().includes(lowerQuery))\n );\n}\n","/**\n * Tool Definitions\n *\n * MCP tool schema definitions for all Idealyst tools.\n * These can be used to register tools with an MCP server or other systems.\n */\n\nimport type { ToolDefinition } from \"./types.js\";\n\n// ============================================================================\n// Component Tool Definitions\n// ============================================================================\n\nexport const listComponentsDefinition: ToolDefinition = {\n name: \"list_components\",\n description: \"List all available Idealyst components with brief descriptions\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport const getComponentDocsDefinition: ToolDefinition = {\n name: \"get_component_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst component including props, usage, and examples\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input')\",\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExampleDefinition: ToolDefinition = {\n name: \"get_component_example\",\n description: \"Get a code example for a specific Idealyst component\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component\",\n },\n example_type: {\n type: \"string\",\n description:\n \"Type of example: 'basic', 'variants', 'with-icons', 'interactive'\",\n enum: [\"basic\", \"variants\", \"with-icons\", \"interactive\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const searchComponentsDefinition: ToolDefinition = {\n name: \"search_components\",\n description: \"Search for components by name, category, or feature\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n category: {\n type: \"string\",\n description:\n \"Filter by category: 'layout', 'form', 'display', 'navigation', 'overlay', 'data'\",\n enum: [\"layout\", \"form\", \"display\", \"navigation\", \"overlay\", \"data\"],\n },\n },\n },\n};\n\nexport const getComponentTypesDefinition: ToolDefinition = {\n name: \"get_component_types\",\n description:\n \"Get TypeScript type definitions for a specific component directly from the source. Returns the actual TypeScript interface and/or JSON schema.\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input')\",\n },\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript' for raw TypeScript definitions, 'json' for parsed schema, 'both' for combined output (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExamplesTsDefinition: ToolDefinition = {\n name: \"get_component_examples_ts\",\n description:\n \"Get validated TypeScript example code for a component. These examples are type-checked and guaranteed to compile.\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component (e.g., 'Button', 'Card')\",\n },\n },\n required: [\"component\"],\n },\n};\n\n// ============================================================================\n// CLI Tool Definitions\n// ============================================================================\n\nexport const getCliUsageDefinition: ToolDefinition = {\n name: \"get_cli_usage\",\n description: \"Get information about Idealyst CLI commands and usage\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"Specific CLI command to get info about (optional)\",\n },\n },\n },\n};\n\n// ============================================================================\n// Icon Tool Definitions\n// ============================================================================\n\nexport const searchIconsDefinition: ToolDefinition = {\n name: \"search_icons\",\n description:\n \"Search for Material Design Icons by name or keyword. Returns matching icon names from 7,447 available icons.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search term to find icons (e.g., 'home', 'user', 'arrow')\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of results to return (default: 20)\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Theme Tool Definitions\n// ============================================================================\n\nexport const getThemeTypesDefinition: ToolDefinition = {\n name: \"get_theme_types\",\n description:\n \"Get TypeScript type definitions for theme types (Size, Intent, Color, etc.) directly from @idealyst/theme\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Navigation Tool Definitions\n// ============================================================================\n\nexport const getNavigationTypesDefinition: ToolDefinition = {\n name: \"get_navigation_types\",\n description:\n \"Get TypeScript type definitions for navigation types directly from @idealyst/navigation\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Guide Tool Definitions\n// ============================================================================\n\nexport const getTranslateGuideDefinition: ToolDefinition = {\n name: \"get_translate_guide\",\n description:\n \"Get documentation for @idealyst/translate internationalization package. Covers runtime API, Babel plugin, translation files, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'runtime-api', 'babel-plugin', 'translation-files', 'examples'\",\n enum: [\n \"overview\",\n \"runtime-api\",\n \"babel-plugin\",\n \"translation-files\",\n \"examples\",\n ],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getStorageGuideDefinition: ToolDefinition = {\n name: \"get_storage_guide\",\n description:\n \"Get documentation for @idealyst/storage cross-platform storage package. Covers API reference and usage examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\n// ============================================================================\n// Package Tool Definitions\n// ============================================================================\n\nexport const listPackagesDefinition: ToolDefinition = {\n name: \"list_packages\",\n description:\n \"List all available Idealyst packages with descriptions, categories, and documentation status. Use this to discover what packages are available in the framework.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\"core\", \"ui\", \"media\", \"data\", \"auth\", \"utility\", \"tooling\"],\n },\n },\n },\n};\n\nexport const getPackageDocsDefinition: ToolDefinition = {\n name: \"get_package_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst package including installation, features, quick start, and API highlights.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'oauth-client', 'datagrid')\",\n },\n section: {\n type: \"string\",\n description:\n \"Specific section to retrieve (optional, returns all if not specified)\",\n enum: [\"overview\", \"installation\", \"features\", \"quickstart\", \"api\"],\n },\n },\n required: [\"package\"],\n },\n};\n\nexport const searchPackagesDefinition: ToolDefinition = {\n name: \"search_packages\",\n description:\n \"Search across all Idealyst packages by name, description, or features.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Recipe Tool Definitions\n// ============================================================================\n\nexport const listRecipesDefinition: ToolDefinition = {\n name: \"list_recipes\",\n description:\n \"List all available Idealyst recipes (common UI patterns) with descriptions. Recipes provide ready-to-use code examples for building apps.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\n \"forms\",\n \"navigation\",\n \"data\",\n \"layout\",\n \"auth\",\n \"settings\",\n \"media\",\n ],\n },\n difficulty: {\n type: \"string\",\n description: \"Filter by difficulty (optional)\",\n enum: [\"beginner\", \"intermediate\", \"advanced\"],\n },\n },\n },\n};\n\nexport const getRecipeDefinition: ToolDefinition = {\n name: \"get_recipe\",\n description:\n \"Get a complete code recipe for a common UI pattern. Returns ready-to-use code with explanation and tips.\",\n inputSchema: {\n type: \"object\",\n properties: {\n recipe: {\n type: \"string\",\n description:\n \"Recipe ID (e.g., 'login-form', 'settings-screen', 'tab-navigation')\",\n },\n },\n required: [\"recipe\"],\n },\n};\n\nexport const searchRecipesDefinition: ToolDefinition = {\n name: \"search_recipes\",\n description:\n \"Search for recipes by name, description, category, or required packages.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (e.g., 'auth', 'form', 'navigation')\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Install Guide Tool Definitions\n// ============================================================================\n\nexport const getInstallGuideDefinition: ToolDefinition = {\n name: \"get_install_guide\",\n description:\n \"Get detailed installation instructions for an Idealyst package, including iOS (Info.plist, CocoaPods), Android (AndroidManifest.xml, permissions, Gradle), and web configuration. Essential for packages with native dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'audio', 'oauth-client', 'storage')\",\n },\n },\n required: [\"package\"],\n },\n};\n\n// ============================================================================\n// All Tool Definitions Array\n// ============================================================================\n\n/**\n * Array of all tool definitions.\n * Use this to register all tools with an MCP server.\n */\nexport const toolDefinitions: ToolDefinition[] = [\n // Component tools\n listComponentsDefinition,\n getComponentDocsDefinition,\n getComponentExampleDefinition,\n searchComponentsDefinition,\n getComponentTypesDefinition,\n getComponentExamplesTsDefinition,\n // CLI tools\n getCliUsageDefinition,\n // Icon tools\n searchIconsDefinition,\n // Theme tools\n getThemeTypesDefinition,\n // Navigation tools\n getNavigationTypesDefinition,\n // Guide tools\n getTranslateGuideDefinition,\n getStorageGuideDefinition,\n // Package tools\n listPackagesDefinition,\n getPackageDocsDefinition,\n searchPackagesDefinition,\n // Recipe tools\n listRecipesDefinition,\n getRecipeDefinition,\n searchRecipesDefinition,\n // Install guide tools\n getInstallGuideDefinition,\n];\n\n/**\n * Map of tool definitions by name.\n * Use this for quick lookup of a specific tool definition.\n */\nexport const toolDefinitionMap: Record<string, ToolDefinition> =\n Object.fromEntries(toolDefinitions.map((tool) => [tool.name, tool]));\n","/**\n * Component Metadata\n *\n * Minimal metadata for components that cannot be derived from TypeScript types\n * or example files. Types come from @idealyst/tooling, examples come from\n * the examples/components/*.examples.tsx files.\n */\n\nexport interface ComponentMetadata {\n /** Category for filtering/search */\n category: 'form' | 'feedback' | 'layout' | 'display' | 'navigation' | 'overlay' | 'data';\n /** Brief description of the component */\n description: string;\n /** Key features of the component */\n features: string[];\n /** Best practices for using the component */\n bestPractices: string[];\n}\n\nexport const componentMetadata: Record<string, ComponentMetadata> = {\n Accordion: {\n category: 'display',\n description: 'Expandable content sections that show/hide content on user interaction',\n features: [\n 'Single or multiple expanded sections',\n 'Customizable icons',\n 'Disabled state support',\n 'Controlled and uncontrolled modes',\n ],\n bestPractices: [\n 'Use for organizing related content into collapsible sections',\n 'Keep section titles concise and descriptive',\n 'Consider single-expand mode for sequential content',\n ],\n },\n\n ActivityIndicator: {\n category: 'feedback',\n description: 'Loading spinner to indicate ongoing operations',\n features: [\n 'Multiple sizes',\n 'Intent colors',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use for short loading operations',\n 'For longer operations, consider Progress with determinate value',\n 'Place near the content being loaded',\n ],\n },\n\n Alert: {\n category: 'feedback',\n description: 'Message banner for displaying important information, warnings, errors, and success messages',\n features: [\n 'Five intent types with semantic meaning',\n 'Three visual variants (filled, outlined, soft)',\n 'Default icons for each intent',\n 'Custom icon support',\n 'Dismissible with close button',\n 'Action buttons support',\n ],\n bestPractices: [\n \"Use 'danger' intent for critical errors requiring immediate attention\",\n \"Use 'warning' intent for important but non-critical information\",\n \"Use 'success' intent for positive confirmations\",\n \"Use 'info' intent for general informational messages\",\n 'Keep alert messages concise and actionable',\n ],\n },\n\n Avatar: {\n category: 'display',\n description: 'User or entity representation with image, initials, or icon fallback',\n features: [\n 'Image, initials, or icon display',\n 'Multiple sizes (xs, sm, md, lg, xl)',\n 'Circle or square shapes',\n 'Automatic fallback to initials',\n 'Custom background colors',\n ],\n bestPractices: [\n 'Provide fallback initials for missing images',\n 'Use consistent sizes within lists',\n 'Consider accessibility with alt text',\n ],\n },\n\n Badge: {\n category: 'display',\n description: 'Small status indicator or count display',\n features: [\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Filled, outlined, and soft variants',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for status indicators or counts',\n 'Keep badge content minimal (numbers or short text)',\n 'Use semantic intent colors for meaning',\n ],\n },\n\n Breadcrumb: {\n category: 'navigation',\n description: 'Navigation trail showing the current page location within a hierarchy',\n features: [\n 'Customizable separators',\n 'Link and text items',\n 'Responsive truncation',\n ],\n bestPractices: [\n 'Use for deep navigation hierarchies',\n 'Keep breadcrumb labels short',\n 'Make all items except the last clickable',\n ],\n },\n\n Button: {\n category: 'form',\n description: 'Interactive button component with multiple variants, sizes, and icon support',\n features: [\n 'Three type variants: contained, outlined, text',\n 'Five intent colors: primary, neutral, success, danger, warning',\n 'Five sizes: xs, sm, md, lg, xl',\n 'Loading state with spinner',\n 'Gradient overlay effects',\n 'Left and right icon support',\n 'Disabled states',\n 'Cross-platform',\n ],\n bestPractices: [\n \"Use 'primary' intent for main actions\",\n \"Use 'contained' type for prominent actions\",\n 'Keep button labels concise and action-oriented',\n 'Use loading state for async operations',\n ],\n },\n\n Card: {\n category: 'layout',\n description: 'Container component for grouping related content with optional elevation and borders',\n features: [\n 'Multiple variants (default, outlined, elevated, filled)',\n 'Clickable mode with press feedback',\n 'Customizable border radius',\n 'Intent colors',\n ],\n bestPractices: [\n 'Use for grouping related content',\n 'Keep card content focused on a single topic',\n \"Use 'elevated' variant sparingly for emphasis\",\n ],\n },\n\n Checkbox: {\n category: 'form',\n description: 'Toggle control for binary choices with optional label',\n features: [\n 'Checked, unchecked, and indeterminate states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Error state with helper text',\n 'Custom children support',\n ],\n bestPractices: [\n 'Use for independent binary choices',\n 'Use RadioButton for mutually exclusive options',\n 'Provide clear, descriptive labels',\n ],\n },\n\n Chip: {\n category: 'display',\n description: 'Compact element for tags, filters, or selections',\n features: [\n 'Filled, outlined, and soft variants',\n 'Intent colors',\n 'Multiple sizes',\n 'Deletable with close icon',\n 'Selectable mode',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for tags, filters, or compact selections',\n 'Keep chip labels concise',\n 'Use consistent styling within groups',\n ],\n },\n\n Dialog: {\n category: 'overlay',\n description: 'Modal overlay for important content requiring user attention or interaction',\n features: [\n 'Multiple sizes (sm, md, lg, fullscreen)',\n 'Standard, alert, and confirmation types',\n 'Title and close button',\n 'Backdrop click to close',\n 'Animation types (slide, fade)',\n ],\n bestPractices: [\n 'Use sparingly for important interactions',\n 'Provide clear actions for dismissal',\n 'Keep dialog content focused',\n 'Use confirmation dialogs for destructive actions',\n ],\n },\n\n Divider: {\n category: 'layout',\n description: 'Visual separator for content sections',\n features: [\n 'Horizontal and vertical orientations',\n 'Solid, dashed, and dotted types',\n 'Multiple sizes (thickness)',\n 'Intent colors',\n 'Text/content dividers',\n 'Configurable spacing',\n ],\n bestPractices: [\n 'Use to separate distinct content sections',\n 'Avoid overuse - whitespace is often sufficient',\n 'Use text dividers for labeled sections',\n ],\n },\n\n Icon: {\n category: 'display',\n description: 'Material Design icon component with extensive icon library',\n features: [\n '7,447+ Material Design icons',\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Accessibility support',\n ],\n bestPractices: [\n 'Use meaningful icons that match their purpose',\n 'Pair icons with text for clarity when needed',\n 'Maintain consistent icon sizing',\n ],\n },\n\n Image: {\n category: 'display',\n description: 'Cross-platform image component with loading and error states',\n features: [\n 'Multiple resize modes',\n 'Loading placeholder',\n 'Error fallback',\n 'Lazy loading',\n 'Border radius support',\n ],\n bestPractices: [\n 'Provide appropriate alt text',\n 'Use correct resize mode for layout',\n 'Consider placeholder for slow-loading images',\n ],\n },\n\n Link: {\n category: 'navigation',\n description: 'Navigation link component for routing and external URLs',\n features: [\n 'Internal and external link support',\n 'Intent colors',\n 'Underline variants',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for navigation, not actions (use Button for actions)',\n 'Make link text descriptive',\n 'Indicate external links when appropriate',\n ],\n },\n\n List: {\n category: 'data',\n description: 'Optimized list component for displaying scrollable data',\n features: [\n 'Virtualized rendering for performance',\n 'Pull-to-refresh',\n 'Infinite scroll',\n 'Section headers',\n 'Empty state support',\n ],\n bestPractices: [\n 'Use for displaying collections of similar items',\n 'Implement pull-to-refresh for refreshable content',\n 'Provide empty state feedback',\n ],\n },\n\n Menu: {\n category: 'overlay',\n description: 'Dropdown menu for displaying a list of actions or options',\n features: [\n 'Trigger-based display',\n 'Multiple placements',\n 'Icon and description support',\n 'Dividers between groups',\n 'Keyboard navigation',\n ],\n bestPractices: [\n 'Group related actions together',\n 'Use icons for quick recognition',\n 'Keep menu items to a reasonable number',\n ],\n },\n\n Popover: {\n category: 'overlay',\n description: 'Floating content container anchored to a trigger element',\n features: [\n 'Multiple placements',\n 'Customizable content',\n 'Controlled and uncontrolled modes',\n 'Click outside to close',\n ],\n bestPractices: [\n 'Use for supplementary content or controls',\n 'Keep popover content focused',\n 'Consider mobile touch interactions',\n ],\n },\n\n Pressable: {\n category: 'form',\n description: 'Low-level touchable component for custom interactive elements',\n features: [\n 'Press feedback',\n 'Long press support',\n 'Disabled state',\n 'Custom hit slop',\n ],\n bestPractices: [\n 'Use Button for standard button interactions',\n 'Use Pressable for custom interactive areas',\n 'Provide visual feedback on press',\n ],\n },\n\n Progress: {\n category: 'feedback',\n description: 'Visual indicator for task completion or loading progress',\n features: [\n 'Linear and circular variants',\n 'Determinate and indeterminate modes',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Rounded option',\n ],\n bestPractices: [\n 'Use determinate progress when percentage is known',\n 'Use indeterminate for unknown duration',\n 'Show percentage for long operations',\n ],\n },\n\n RadioButton: {\n category: 'form',\n description: 'Selection control for mutually exclusive options',\n features: [\n 'Single selection in a group',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for mutually exclusive options',\n 'Group related options together',\n 'Provide a default selection when appropriate',\n ],\n },\n\n Screen: {\n category: 'layout',\n description: 'Full-screen container component for app screens',\n features: [\n 'Safe area handling',\n 'Keyboard avoiding behavior',\n 'Status bar configuration',\n 'Background color support',\n ],\n bestPractices: [\n 'Use as the root container for screens',\n 'Enable keyboard avoiding for form screens',\n 'Configure safe areas appropriately',\n ],\n },\n\n Select: {\n category: 'form',\n description: 'Dropdown selection component for choosing from a list of options',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Searchable (web)',\n 'Label and helper text',\n 'Error state',\n 'Disabled options',\n ],\n bestPractices: [\n 'Use for selecting from many options',\n 'Use RadioButton for 2-5 visible options',\n 'Provide a clear placeholder',\n ],\n },\n\n Skeleton: {\n category: 'feedback',\n description: 'Placeholder loading state for content',\n features: [\n 'Multiple shapes (text, circle, rectangle)',\n 'Customizable dimensions',\n 'Animation support',\n ],\n bestPractices: [\n 'Match skeleton shape to actual content',\n 'Use for predictable content layouts',\n 'Avoid for dynamic or unknown layouts',\n ],\n },\n\n Slider: {\n category: 'form',\n description: 'Range input control for selecting numeric values',\n features: [\n 'Min/max/step configuration',\n 'Value display',\n 'Min/max labels',\n 'Custom marks',\n 'Intent colors',\n 'Multiple sizes',\n ],\n bestPractices: [\n 'Use for selecting from a continuous range',\n 'Show current value for precision',\n 'Use marks for discrete steps',\n ],\n },\n\n SVGImage: {\n category: 'display',\n description: 'SVG image component for vector graphics',\n features: [\n 'URL and inline SVG support',\n 'Color tinting',\n 'Responsive sizing',\n ],\n bestPractices: [\n 'Use for scalable graphics',\n 'Provide fallback for missing SVGs',\n 'Consider Icon for simple icons',\n ],\n },\n\n Switch: {\n category: 'form',\n description: 'Toggle control for binary on/off states',\n features: [\n 'On/off states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Custom on/off icons',\n ],\n bestPractices: [\n 'Use for immediate effect toggles',\n 'Use Checkbox when submission is required',\n 'Provide clear labels indicating the on state',\n ],\n },\n\n TabBar: {\n category: 'navigation',\n description: 'Bottom navigation bar for main app sections',\n features: [\n 'Icon and label tabs',\n 'Badge indicators',\n 'Custom styling',\n ],\n bestPractices: [\n 'Limit to 3-5 main destinations',\n 'Use clear, recognizable icons',\n 'Show badges for notifications',\n ],\n },\n\n Table: {\n category: 'data',\n description: 'Structured data display in rows and columns',\n features: [\n 'Sortable columns',\n 'Custom cell rendering',\n 'Header and footer',\n 'Striped rows',\n ],\n bestPractices: [\n 'Use for structured, comparable data',\n 'Align numbers to the right',\n 'Provide sorting for large datasets',\n ],\n },\n\n Tabs: {\n category: 'navigation',\n description: 'Horizontal tab navigation for switching between content panels',\n features: [\n 'Controlled and uncontrolled modes',\n 'Icon and label tabs',\n 'Scrollable for many tabs',\n 'Badge support',\n ],\n bestPractices: [\n 'Use for content at the same hierarchy level',\n 'Keep tab labels short',\n 'Limit visible tabs to avoid scrolling',\n ],\n },\n\n Text: {\n category: 'display',\n description: 'Typography component for displaying text with consistent styling',\n features: [\n 'Multiple typography variants',\n 'Font weight options',\n 'Color variants',\n 'Text alignment',\n ],\n bestPractices: [\n 'Use typography variants consistently',\n 'Maintain hierarchy with size and weight',\n 'Use semantic colors for meaning',\n ],\n },\n\n TextArea: {\n category: 'form',\n description: 'Multi-line text input for longer content',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Character count',\n 'Auto-resize',\n 'Error state',\n ],\n bestPractices: [\n 'Use for multi-line input',\n 'Show character limits when applicable',\n 'Provide appropriate placeholder text',\n ],\n },\n\n TextInput: {\n category: 'form',\n description: 'Single-line text input field with various configurations',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Left and right icons',\n 'Password visibility toggle',\n 'Input modes (text, email, number, etc.)',\n 'Error state with helper text',\n ],\n bestPractices: [\n 'Use appropriate input mode for content type',\n 'Provide clear labels and placeholders',\n 'Show validation errors inline',\n ],\n },\n\n Tooltip: {\n category: 'overlay',\n description: 'Contextual information popup on hover or focus',\n features: [\n 'Multiple placements',\n 'Customizable delay',\n 'Arrow indicator',\n 'Custom content support',\n ],\n bestPractices: [\n 'Use for supplementary information',\n 'Keep tooltip content brief',\n 'Ensure touch-friendly alternatives for mobile',\n ],\n },\n\n Video: {\n category: 'display',\n description: 'Video player component with playback controls',\n features: [\n 'Multiple source support',\n 'Playback controls',\n 'Poster image',\n 'Loop and autoplay',\n ],\n bestPractices: [\n 'Provide poster images for preview',\n 'Consider autoplay carefully (user experience)',\n 'Support multiple formats for compatibility',\n ],\n },\n\n View: {\n category: 'layout',\n description: 'Fundamental layout container with spacing and flex support',\n features: [\n 'Spacing presets',\n 'Flex layout shortcuts',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use spacing prop for consistent gaps',\n 'Prefer View over native div/View for consistency',\n 'Use for layout structure, not styling',\n ],\n },\n};\n\n/**\n * Find the canonical component name (case-insensitive lookup)\n */\nexport function findComponentName(componentName: string): string | undefined {\n // Direct match first (fast path)\n if (componentMetadata[componentName]) {\n return componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n return Object.keys(componentMetadata).find(\n (name) => name.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get metadata for a specific component (case-insensitive)\n */\nexport function getComponentMetadata(componentName: string): ComponentMetadata | undefined {\n const canonicalName = findComponentName(componentName);\n return canonicalName ? componentMetadata[canonicalName] : undefined;\n}\n\n/**\n * Get all component names\n */\nexport function getComponentNames(): string[] {\n return Object.keys(componentMetadata);\n}\n\n/**\n * Search components by name, description, or features\n */\nexport function searchComponents(query: string, category?: string): string[] {\n const lowerQuery = query.toLowerCase();\n\n return Object.entries(componentMetadata)\n .filter(([name, meta]) => {\n if (category && meta.category !== category) {\n return false;\n }\n\n return (\n name.toLowerCase().includes(lowerQuery) ||\n meta.description.toLowerCase().includes(lowerQuery) ||\n meta.features.some(f => f.toLowerCase().includes(lowerQuery))\n );\n })\n .map(([name]) => name);\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(category: string): string[] {\n return Object.entries(componentMetadata)\n .filter(([_, meta]) => meta.category === category)\n .map(([name]) => name);\n}\n","export const cliCommands: Record<string, any> = {\n init: {\n description: \"Initialize a new Idealyst workspace with monorepo structure\",\n usage: \"idealyst init <workspace-name> [options]\",\n options: [\n {\n flag: \"workspace-name\",\n description: \"Name for the new workspace (required)\",\n },\n {\n flag: \"--git\",\n description: \"Initialize git repository (default: true)\",\n },\n {\n flag: \"--install\",\n description: \"Install dependencies after creation (default: true)\",\n },\n ],\n examples: [\n \"idealyst init my-app\",\n \"idealyst init my-company-workspace --no-git\",\n ],\n },\n\n create: {\n description: \"Create a new package within the Idealyst workspace\",\n usage: \"idealyst create <name> --type <type> [options]\",\n options: [\n {\n flag: \"name\",\n description: \"Name for the new package (required)\",\n },\n {\n flag: \"--type\",\n description: \"Package type: web | native | api | database | shared (required)\",\n },\n {\n flag: \"--app-name\",\n description: \"Display name for native app (required for native type)\",\n },\n {\n flag: \"--with-trpc\",\n description: \"Include tRPC setup (for web/native)\",\n },\n {\n flag: \"--no-trpc\",\n description: \"Exclude tRPC setup (for web/native)\",\n },\n ],\n examples: [\n \"idealyst create web --type web --with-trpc\",\n \"idealyst create mobile --type native --app-name \\\"My App\\\" --with-trpc\",\n \"idealyst create api --type api\",\n \"idealyst create database --type database\",\n \"idealyst create shared --type shared\",\n ],\n },\n\n dev: {\n description: \"Start development server for a package\",\n usage: \"cd packages/<name> && yarn dev\",\n options: [\n {\n flag: \"--port\",\n description: \"Port number for dev server (web only)\",\n },\n ],\n examples: [\n \"cd packages/web && yarn dev\",\n \"cd packages/native && yarn dev\",\n ],\n },\n\n build: {\n description: \"Build a package for production\",\n usage: \"cd packages/<name> && yarn build\",\n options: [],\n examples: [\n \"cd packages/web && yarn build\",\n \"cd packages/api && yarn build\",\n ],\n },\n\n test: {\n description: \"Run tests for packages\",\n usage: \"yarn test [options]\",\n options: [\n {\n flag: \"--watch\",\n description: \"Run tests in watch mode\",\n },\n {\n flag: \"--coverage\",\n description: \"Generate coverage report\",\n },\n ],\n examples: [\n \"yarn test\",\n \"yarn test:watch\",\n \"yarn test:coverage\",\n ],\n },\n};\n","/**\n * Installation Guides for Idealyst Packages\n *\n * Provides detailed installation instructions including:\n * - npm/yarn installation commands\n * - iOS configuration (Info.plist, CocoaPods)\n * - Android configuration (AndroidManifest.xml, Gradle)\n * - Additional dependencies and peer dependencies\n */\n\nexport interface InstallGuide {\n packageName: string;\n npmName: string;\n description: string;\n platforms: (\"web\" | \"native\" | \"node\")[];\n complexity: \"simple\" | \"moderate\" | \"complex\";\n\n // Basic installation\n installation: {\n yarn: string;\n npm: string;\n };\n\n // Peer dependencies to install\n peerDependencies?: {\n name: string;\n required: boolean;\n platforms: (\"web\" | \"native\")[];\n note?: string;\n }[];\n\n // iOS-specific configuration\n ios?: {\n podInstallRequired: boolean;\n infoPlistEntries?: {\n key: string;\n value: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Android-specific configuration\n android?: {\n permissions?: {\n permission: string;\n description: string;\n }[];\n manifestEntries?: {\n location: string;\n xml: string;\n description: string;\n }[];\n gradleChanges?: {\n file: string;\n changes: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Web-specific configuration\n web?: {\n additionalDependencies?: string[];\n bundlerConfig?: string;\n notes?: string[];\n };\n\n // Post-installation verification\n verification?: string;\n\n // Common issues and solutions\n troubleshooting?: {\n issue: string;\n solution: string;\n }[];\n}\n\nexport const installGuides: Record<string, InstallGuide> = {\n // ============================================================================\n // CORE PACKAGES\n // ============================================================================\n\n theme: {\n packageName: \"Theme\",\n npmName: \"@idealyst/theme\",\n description: \"Cross-platform theming system built on react-native-unistyles\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/theme react-native-unistyles\",\n npm: \"npm install @idealyst/theme react-native-unistyles\",\n },\n peerDependencies: [\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for styling system\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required - auto-linked by React Native\",\n ],\n },\n verification: `import { UnistylesProvider } from '@idealyst/theme';\n// Wrap your app with UnistylesProvider`,\n },\n\n components: {\n packageName: \"Components\",\n npmName: \"@idealyst/components\",\n description: \"Cross-platform React UI components for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-reanimated\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated components\",\n },\n {\n name: \"react-native-safe-area-context\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for Screen component\",\n },\n {\n name: \"react-native-vector-icons\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for icons on native\",\n },\n {\n name: \"@mdi/react @mdi/js\",\n required: false,\n platforms: [\"web\"],\n note: \"Required for icons on web\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"If using vector icons, add fonts to Info.plist\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required for base components\",\n \"If using vector icons, follow react-native-vector-icons setup\",\n ],\n },\n web: {\n additionalDependencies: [\"@mdi/react\", \"@mdi/js\"],\n notes: [\n \"Icons use @mdi/react on web instead of vector-icons\",\n \"Ensure your bundler supports .web.tsx and .native.tsx extensions\",\n ],\n },\n },\n\n navigation: {\n packageName: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description: \"Unified navigation system for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/navigation\",\n npm: \"npm install @idealyst/navigation\",\n },\n peerDependencies: [\n {\n name: \"@react-navigation/native @react-navigation/stack @react-navigation/bottom-tabs\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native navigation\",\n },\n {\n name: \"react-native-screens react-native-safe-area-context\",\n required: true,\n platforms: [\"native\"],\n note: \"Required dependencies for React Navigation\",\n },\n {\n name: \"react-native-gesture-handler\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for gesture-based navigation\",\n },\n {\n name: \"react-router react-router-dom\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web routing\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n android: {\n additionalSteps: [\n \"Ensure react-native-screens is configured in MainActivity\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n web: {\n additionalDependencies: [\"react-router\", \"react-router-dom\"],\n },\n },\n\n // ============================================================================\n // MEDIA PACKAGES (Complex Native Setup)\n // ============================================================================\n\n camera: {\n packageName: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture using Vision Camera\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/camera react-native-vision-camera\",\n npm: \"npm install @idealyst/camera react-native-vision-camera\",\n },\n peerDependencies: [\n {\n name: \"react-native-vision-camera\",\n required: true,\n platforms: [\"native\"],\n note: \"Core camera functionality for React Native\",\n },\n {\n name: \"react-native-worklets-core\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for frame processors\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSCameraUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your camera\",\n description: \"Required: Camera permission description\",\n },\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone for video recording\",\n description: \"Required for video recording with audio\",\n },\n {\n key: \"NSPhotoLibraryUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your photo library to save photos\",\n description: \"Optional: Only if saving to photo library\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For advanced features, see: https://react-native-vision-camera.com/docs/guides/\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.CAMERA\",\n description: \"Required: Camera access\",\n },\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for video recording with audio\",\n },\n {\n permission: \"android.permission.WRITE_EXTERNAL_STORAGE\",\n description: \"Optional: Only if saving to external storage (API < 29)\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n\n<!-- Required for camera features -->\n<uses-feature android:name=\"android.hardware.camera\" android:required=\"false\" />\n<uses-feature android:name=\"android.hardware.camera.autofocus\" android:required=\"false\" />`,\n description: \"Camera and audio permissions\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher in android/build.gradle\",\n \"Enable Kotlin if not already enabled\",\n \"For CameraX features, ensure you have the latest camera libraries\",\n ],\n },\n web: {\n notes: [\n \"Uses native MediaDevices API (WebRTC)\",\n \"Requires HTTPS in production for camera access\",\n \"User must grant camera permission in browser\",\n ],\n },\n verification: `import { Camera, useCameraPermission } from '@idealyst/camera';\n\nconst { hasPermission, requestPermission } = useCameraPermission();\nif (!hasPermission) {\n await requestPermission();\n}`,\n troubleshooting: [\n {\n issue: \"Camera not showing on iOS\",\n solution:\n \"Ensure NSCameraUsageDescription is in Info.plist and rebuild the app\",\n },\n {\n issue: \"Permission denied on Android\",\n solution:\n \"Check AndroidManifest.xml has CAMERA permission and user granted it at runtime\",\n },\n {\n issue: \"Build fails with Vision Camera\",\n solution:\n \"Ensure you have the latest CocoaPods (iOS) or Gradle (Android) and clean build\",\n },\n ],\n },\n\n audio: {\n packageName: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for recording, playback, and PCM streaming using React Native Audio API\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/audio react-native-audio-api\",\n npm: \"npm install @idealyst/audio react-native-audio-api\",\n },\n peerDependencies: [\n {\n name: \"react-native-audio-api\",\n required: true,\n platforms: [\"native\"],\n note: \"Core audio API for React Native (Web Audio API polyfill)\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone to record audio\",\n description: \"Required for recording: Microphone permission description\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For background audio, add audio background mode to Info.plist\",\n \"Audio session is auto-configured for playAndRecord mode\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for recording: Microphone access\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />`,\n description: \"Microphone permission for recording\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher\",\n \"Permission must be requested at runtime on Android 6.0+\",\n \"No additional permissions required for playback only\",\n ],\n },\n web: {\n notes: [\n \"Uses Web Audio API for recording and playback\",\n \"Requires HTTPS in production for microphone access\",\n \"User must grant microphone permission in browser for recording\",\n \"No permissions required for playback only\",\n \"Supports PCM streaming for real-time TTS playback\",\n ],\n },\n verification: `import { useRecorder, usePlayer, useAudio, AUDIO_PROFILES } from '@idealyst/audio';\n\n// Initialize audio session (recommended)\nconst audio = useAudio();\n\n// Recording\nconst recorder = useRecorder({ config: AUDIO_PROFILES.speech });\nawait recorder.start();\n// ... later\nawait recorder.stop();\n\n// File playback\nconst player = usePlayer();\nawait player.loadFile('/audio/music.mp3');\nawait player.play();\n\n// PCM streaming (for TTS)\nawait player.loadPCMStream(AUDIO_PROFILES.speech);\nawait player.play();\nplayer.feedPCMData(pcmData);`,\n troubleshooting: [\n {\n issue: \"No audio data received during recording\",\n solution:\n \"Ensure microphone permission is granted and check subscribeToData callback\",\n },\n {\n issue: \"Build fails on iOS\",\n solution:\n \"Run pod install and ensure NSMicrophoneUsageDescription is set in Info.plist\",\n },\n {\n issue: \"Permission prompt not appearing on web\",\n solution: \"Ensure page is served over HTTPS (required for getUserMedia)\",\n },\n {\n issue: \"Recording and playback conflict on iOS\",\n solution:\n \"Use useAudio() hook to initialize session with playAndRecord category, or use SESSION_PRESETS.voiceChat\",\n },\n {\n issue: \"Audio cuts out when switching between recording and playback\",\n solution:\n \"Ensure audio session is configured with SESSION_PRESETS.default which enables simultaneous recording and playback\",\n },\n ],\n },\n\n // ============================================================================\n // DATA & STORAGE PACKAGES\n // ============================================================================\n\n storage: {\n packageName: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with MMKV on native and localStorage on web\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/storage react-native-mmkv\",\n npm: \"npm install @idealyst/storage react-native-mmkv\",\n },\n peerDependencies: [\n {\n name: \"react-native-mmkv\",\n required: true,\n platforms: [\"native\"],\n note: \"High-performance storage for React Native\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"MMKV requires iOS 11.0 or higher\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required\",\n \"MMKV auto-links with React Native\",\n \"Ensure minSdkVersion is 21 or higher\",\n ],\n },\n web: {\n notes: [\n \"Uses localStorage as the storage backend\",\n \"Falls back gracefully if localStorage is unavailable\",\n \"API is identical across platforms\",\n ],\n },\n verification: `import { storage } from '@idealyst/storage';\n\nawait storage.set('key', { data: 'value' });\nconst data = await storage.get('key');`,\n },\n\n datagrid: {\n packageName: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/datagrid @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/components\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-window\",\n required: true,\n platforms: [\"web\"],\n note: \"Virtualization library for web\",\n },\n ],\n web: {\n additionalDependencies: [\"react-window\"],\n notes: [\"Uses react-window for virtualized rendering on web\"],\n },\n },\n\n // ============================================================================\n // AUTH PACKAGES\n // ============================================================================\n\n \"oauth-client\": {\n packageName: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description: \"Universal OAuth2 client with PKCE support for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n npm: \"npm install @idealyst/oauth-client @idealyst/storage\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/storage\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for secure token storage\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"CFBundleURLTypes\",\n value: `<array>\n <dict>\n <key>CFBundleURLSchemes</key>\n <array>\n <string>com.yourapp</string>\n </array>\n </dict>\n</array>`,\n description: \"URL scheme for OAuth callback deep links\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Replace 'com.yourapp' with your app's bundle identifier or custom scheme\",\n \"Handle the URL in your AppDelegate or SceneDelegate\",\n ],\n },\n android: {\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <activity> for MainActivity)\",\n xml: `<intent-filter android:label=\"oauth_callback\">\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n <category android:name=\"android.intent.category.BROWSABLE\" />\n <data android:scheme=\"com.yourapp\" />\n</intent-filter>`,\n description:\n \"Deep link handler for OAuth callback. Replace 'com.yourapp' with your scheme.\",\n },\n ],\n additionalSteps: [\n \"Replace 'com.yourapp' with your app's package name or custom scheme\",\n \"Ensure the scheme matches your OAuth provider's redirect URI configuration\",\n ],\n },\n web: {\n notes: [\n \"Uses standard browser redirect for OAuth flow\",\n \"Tokens are stored in localStorage via @idealyst/storage\",\n \"Configure your OAuth provider to allow your web app's origin\",\n ],\n },\n verification: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'com.yourapp://callback',\n});\n\nawait oauth.login();`,\n troubleshooting: [\n {\n issue: \"OAuth redirect not returning to app (iOS)\",\n solution:\n \"Ensure CFBundleURLSchemes in Info.plist matches your redirectUri scheme\",\n },\n {\n issue: \"OAuth redirect not returning to app (Android)\",\n solution:\n \"Ensure intent-filter scheme in AndroidManifest matches your redirectUri\",\n },\n {\n issue: \"CORS errors on token exchange (web)\",\n solution:\n \"Token exchange must be done server-side or ensure provider supports CORS\",\n },\n ],\n },\n\n // ============================================================================\n // UI PACKAGES\n // ============================================================================\n\n datepicker: {\n packageName: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description: \"Cross-platform date and time picker components\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datepicker @idealyst/theme\",\n npm: \"npm install @idealyst/datepicker @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for calendar icons\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install (if using react-native-svg)\"],\n },\n },\n\n markdown: {\n packageName: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer with GitHub Flavored Markdown support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/markdown @idealyst/theme\",\n npm: \"npm install @idealyst/markdown @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-markdown remark-gfm\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web markdown rendering\",\n },\n {\n name: \"react-native-markdown-display react-native-webview\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native markdown rendering\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"WebView requires additional iOS configuration for some features\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration for basic markdown\",\n \"WebView is included in React Native by default\",\n ],\n },\n web: {\n additionalDependencies: [\"react-markdown\", \"remark-gfm\"],\n },\n },\n\n blur: {\n packageName: \"Blur\",\n npmName: \"@idealyst/blur\",\n description: \"Cross-platform blur component\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/blur @react-native-community/blur\",\n npm: \"npm install @idealyst/blur @react-native-community/blur\",\n },\n peerDependencies: [\n {\n name: \"@react-native-community/blur\",\n required: true,\n platforms: [\"native\"],\n note: \"Native blur implementation\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Blur uses RenderScript which is included in Android SDK\",\n \"Ensure compileSdkVersion is 31 or higher\",\n ],\n },\n web: {\n notes: [\"Uses CSS backdrop-filter for blur effect on web\"],\n },\n },\n\n lottie: {\n packageName: \"Lottie\",\n npmName: \"@idealyst/lottie\",\n description: \"Cross-platform Lottie animation support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/lottie lottie-react-native lottie-web\",\n npm: \"npm install @idealyst/lottie lottie-react-native lottie-web\",\n },\n peerDependencies: [\n {\n name: \"lottie-react-native\",\n required: true,\n platforms: [\"native\"],\n note: \"Native Lottie player\",\n },\n {\n name: \"lottie-web\",\n required: true,\n platforms: [\"web\"],\n note: \"Web Lottie player\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\"No additional configuration required\"],\n },\n },\n\n animate: {\n packageName: \"Animate\",\n npmName: \"@idealyst/animate\",\n description: \"Cross-platform animation utilities\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/animate react-native-reanimated\",\n npm: \"npm install @idealyst/animate react-native-reanimated\",\n },\n peerDependencies: [\n {\n name: \"react-native-reanimated\",\n required: true,\n platforms: [\"native\"],\n note: \"Core animation library\",\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated SVGs\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Add Reanimated Babel plugin to babel.config.js:\",\n \"plugins: ['react-native-reanimated/plugin']\",\n \"Ensure Hermes is enabled for best performance\",\n ],\n },\n },\n\n // ============================================================================\n // UTILITY PACKAGES\n // ============================================================================\n\n translate: {\n packageName: \"Translate\",\n npmName: \"@idealyst/translate\",\n description: \"Internationalization (i18n) package with Babel plugin support\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/translate i18next react-i18next\",\n npm: \"npm install @idealyst/translate i18next react-i18next\",\n },\n peerDependencies: [\n {\n name: \"i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n ],\n verification: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\n<TranslateProvider translations={translations} defaultLanguage=\"en\">\n <App />\n</TranslateProvider>`,\n },\n\n config: {\n packageName: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support\",\n platforms: [\"web\", \"native\", \"node\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/config react-native-config\",\n npm: \"npm install @idealyst/config react-native-config\",\n },\n peerDependencies: [\n {\n name: \"react-native-config\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native environment variables\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n android: {\n gradleChanges: [\n {\n file: \"android/app/build.gradle\",\n changes: `apply from: project(':react-native-config').projectDir.getPath() + \"/dotenv.gradle\"`,\n description: \"Add dotenv gradle plugin for environment variables\",\n },\n ],\n additionalSteps: [\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n web: {\n notes: [\n \"Uses Vite's import.meta.env or process.env depending on bundler\",\n \"Configure environment variables in your bundler (Vite, Webpack, etc.)\",\n ],\n },\n },\n\n // ============================================================================\n // TOOLING PACKAGES\n // ============================================================================\n\n cli: {\n packageName: \"CLI\",\n npmName: \"@idealyst/cli\",\n description: \"Command-line tool for generating Idealyst projects\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn global add @idealyst/cli\",\n npm: \"npm install -g @idealyst/cli\",\n },\n verification: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Or use directly without installing\nnpx @idealyst/cli create mobile --type native`,\n },\n\n tooling: {\n packageName: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description: \"Code analysis and validation utilities for Idealyst Framework\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add -D @idealyst/tooling\",\n npm: \"npm install -D @idealyst/tooling\",\n },\n verification: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [idealystPlugin()],\n};`,\n },\n\n \"mcp-server\": {\n packageName: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server for AI assistant integration\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/mcp-server\",\n npm: \"npm install @idealyst/mcp-server\",\n },\n verification: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n },\n};\n\n/**\n * Get installation guide for a package\n */\nexport function getInstallGuide(packageName: string): InstallGuide | undefined {\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n return installGuides[normalizedName];\n}\n\n/**\n * Get all packages that require complex native setup\n */\nexport function getComplexPackages(): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === \"complex\");\n}\n\n/**\n * Get all packages by complexity level\n */\nexport function getPackagesByComplexity(\n complexity: \"simple\" | \"moderate\" | \"complex\"\n): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === complexity);\n}\n\n/**\n * Format installation guide as markdown\n */\nexport function formatInstallGuideMarkdown(guide: InstallGuide): string {\n let md = `# ${guide.packageName} Installation Guide\n\n**Package:** \\`${guide.npmName}\\`\n**Platforms:** ${guide.platforms.join(\", \")}\n**Complexity:** ${guide.complexity}\n\n${guide.description}\n\n## Installation\n\n\\`\\`\\`bash\n# Using Yarn\n${guide.installation.yarn}\n\n# Using npm\n${guide.installation.npm}\n\\`\\`\\`\n`;\n\n // Peer Dependencies\n if (guide.peerDependencies && guide.peerDependencies.length > 0) {\n md += `\\n## Peer Dependencies\\n\\n`;\n for (const dep of guide.peerDependencies) {\n const required = dep.required ? \"**Required**\" : \"Optional\";\n const platforms = dep.platforms.join(\", \");\n md += `- \\`${dep.name}\\` - ${required} (${platforms})`;\n if (dep.note) {\n md += ` - ${dep.note}`;\n }\n md += \"\\n\";\n }\n }\n\n // iOS Configuration\n if (guide.ios && guide.platforms.includes(\"native\")) {\n md += `\\n## iOS Configuration\\n\\n`;\n\n if (guide.ios.podInstallRequired) {\n md += `\\`\\`\\`bash\ncd ios && pod install\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.ios.infoPlistEntries && guide.ios.infoPlistEntries.length > 0) {\n md += `### Info.plist Entries\\n\\nAdd the following to your \\`ios/YourApp/Info.plist\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const entry of guide.ios.infoPlistEntries) {\n md += `<!-- ${entry.description} -->\\n`;\n md += `<key>${entry.key}</key>\\n`;\n if (entry.value.includes(\"<\")) {\n md += `${entry.value}\\n`;\n } else {\n md += `<string>${entry.value}</string>\\n`;\n }\n md += \"\\n\";\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.ios.additionalSteps && guide.ios.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.ios.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Android Configuration\n if (guide.android && guide.platforms.includes(\"native\")) {\n md += `\\n## Android Configuration\\n\\n`;\n\n if (guide.android.permissions && guide.android.permissions.length > 0) {\n md += `### Permissions\\n\\nAdd to \\`android/app/src/main/AndroidManifest.xml\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const perm of guide.android.permissions) {\n md += `<!-- ${perm.description} -->\\n`;\n md += `<uses-permission android:name=\"${perm.permission}\" />\\n`;\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.android.manifestEntries && guide.android.manifestEntries.length > 0) {\n md += `### Manifest Entries\\n\\n`;\n for (const entry of guide.android.manifestEntries) {\n md += `**${entry.location}:**\\n`;\n md += `\\n\\`\\`\\`xml\\n${entry.xml}\\n\\`\\`\\`\\n\\n`;\n md += `_${entry.description}_\\n\\n`;\n }\n }\n\n if (guide.android.gradleChanges && guide.android.gradleChanges.length > 0) {\n md += `### Gradle Changes\\n\\n`;\n for (const change of guide.android.gradleChanges) {\n md += `**${change.file}:**\\n`;\n md += `\\n\\`\\`\\`groovy\\n${change.changes}\\n\\`\\`\\`\\n\\n`;\n md += `_${change.description}_\\n\\n`;\n }\n }\n\n if (guide.android.additionalSteps && guide.android.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.android.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Web Configuration\n if (guide.web && guide.platforms.includes(\"web\")) {\n md += `\\n## Web Configuration\\n\\n`;\n\n if (guide.web.additionalDependencies && guide.web.additionalDependencies.length > 0) {\n md += `### Additional Dependencies\\n\\n\\`\\`\\`bash\\nyarn add ${guide.web.additionalDependencies.join(\" \")}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.bundlerConfig) {\n md += `### Bundler Configuration\\n\\n\\`\\`\\`js\\n${guide.web.bundlerConfig}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.notes && guide.web.notes.length > 0) {\n md += `### Notes\\n\\n`;\n for (const note of guide.web.notes) {\n md += `- ${note}\\n`;\n }\n }\n }\n\n // Verification\n if (guide.verification) {\n md += `\\n## Verification\\n\\nTest your installation:\\n\\n\\`\\`\\`tsx\\n${guide.verification}\\n\\`\\`\\`\\n`;\n }\n\n // Troubleshooting\n if (guide.troubleshooting && guide.troubleshooting.length > 0) {\n md += `\\n## Troubleshooting\\n\\n`;\n for (const item of guide.troubleshooting) {\n md += `### ${item.issue}\\n\\n${item.solution}\\n\\n`;\n }\n }\n\n return md;\n}\n","{\n \"total\": 7447,\n \"icons\": [\n \"ab-testing\",\n \"abacus\",\n \"abjad-arabic\",\n \"abjad-hebrew\",\n \"abugida-devanagari\",\n \"abugida-thai\",\n \"access-point\",\n \"access-point-check\",\n \"access-point-minus\",\n \"access-point-network\",\n \"access-point-network-off\",\n \"access-point-off\",\n \"access-point-plus\",\n \"access-point-remove\",\n \"account\",\n \"account-alert\",\n \"account-alert-outline\",\n \"account-arrow-down\",\n \"account-arrow-down-outline\",\n \"account-arrow-left\",\n \"account-arrow-left-outline\",\n \"account-arrow-right\",\n \"account-arrow-right-outline\",\n \"account-arrow-up\",\n \"account-arrow-up-outline\",\n \"account-badge\",\n \"account-badge-outline\",\n \"account-box\",\n \"account-box-edit-outline\",\n \"account-box-minus-outline\",\n \"account-box-multiple\",\n \"account-box-multiple-outline\",\n \"account-box-outline\",\n \"account-box-plus-outline\",\n \"account-cancel\",\n \"account-cancel-outline\",\n \"account-card\",\n \"account-card-outline\",\n \"account-cash\",\n \"account-cash-outline\",\n \"account-check\",\n \"account-check-outline\",\n \"account-child\",\n \"account-child-circle\",\n \"account-child-outline\",\n \"account-circle\",\n \"account-circle-outline\",\n \"account-clock\",\n \"account-clock-outline\",\n \"account-cog\",\n \"account-cog-outline\",\n \"account-convert\",\n \"account-convert-outline\",\n \"account-cowboy-hat\",\n \"account-cowboy-hat-outline\",\n \"account-credit-card\",\n \"account-credit-card-outline\",\n \"account-details\",\n \"account-details-outline\",\n \"account-edit\",\n \"account-edit-outline\",\n \"account-eye\",\n \"account-eye-outline\",\n \"account-file\",\n \"account-file-outline\",\n \"account-file-text\",\n \"account-file-text-outline\",\n \"account-filter\",\n \"account-filter-outline\",\n \"account-group\",\n \"account-group-outline\",\n \"account-hard-hat\",\n \"account-hard-hat-outline\",\n \"account-heart\",\n \"account-heart-outline\",\n \"account-injury\",\n \"account-injury-outline\",\n \"account-key\",\n \"account-key-outline\",\n \"account-lock\",\n \"account-lock-open\",\n \"account-lock-open-outline\",\n \"account-lock-outline\",\n \"account-minus\",\n \"account-minus-outline\",\n \"account-multiple\",\n \"account-multiple-check\",\n \"account-multiple-check-outline\",\n \"account-multiple-minus\",\n \"account-multiple-minus-outline\",\n \"account-multiple-outline\",\n \"account-multiple-plus\",\n \"account-multiple-plus-outline\",\n \"account-multiple-remove\",\n \"account-multiple-remove-outline\",\n \"account-music\",\n \"account-music-outline\",\n \"account-network\",\n \"account-network-off\",\n \"account-network-off-outline\",\n \"account-network-outline\",\n \"account-off\",\n \"account-off-outline\",\n \"account-outline\",\n \"account-plus\",\n \"account-plus-outline\",\n \"account-question\",\n \"account-question-outline\",\n \"account-reactivate\",\n \"account-reactivate-outline\",\n \"account-remove\",\n \"account-remove-outline\",\n \"account-school\",\n \"account-school-outline\",\n \"account-search\",\n \"account-search-outline\",\n \"account-settings\",\n \"account-settings-outline\",\n \"account-star\",\n \"account-star-outline\",\n \"account-supervisor\",\n \"account-supervisor-circle\",\n \"account-supervisor-circle-outline\",\n \"account-supervisor-outline\",\n \"account-switch\",\n \"account-switch-outline\",\n \"account-sync\",\n \"account-sync-outline\",\n \"account-tag\",\n \"account-tag-outline\",\n \"account-tie\",\n \"account-tie-hat\",\n \"account-tie-hat-outline\",\n \"account-tie-outline\",\n \"account-tie-voice\",\n \"account-tie-voice-off\",\n \"account-tie-voice-off-outline\",\n \"account-tie-voice-outline\",\n \"account-tie-woman\",\n \"account-voice\",\n \"account-voice-off\",\n \"account-wrench\",\n \"account-wrench-outline\",\n \"adjust\",\n \"advertisements\",\n \"advertisements-off\",\n \"air-conditioner\",\n \"air-filter\",\n \"air-horn\",\n \"air-humidifier\",\n \"air-humidifier-off\",\n \"air-purifier\",\n \"air-purifier-off\",\n \"airbag\",\n \"airballoon\",\n \"airballoon-outline\",\n \"airplane\",\n \"airplane-alert\",\n \"airplane-check\",\n \"airplane-clock\",\n \"airplane-cog\",\n \"airplane-edit\",\n \"airplane-landing\",\n \"airplane-marker\",\n \"airplane-minus\",\n \"airplane-off\",\n \"airplane-plus\",\n \"airplane-remove\",\n \"airplane-search\",\n \"airplane-settings\",\n \"airplane-takeoff\",\n \"airport\",\n \"alarm\",\n \"alarm-bell\",\n \"alarm-check\",\n \"alarm-light\",\n \"alarm-light-off\",\n \"alarm-light-off-outline\",\n \"alarm-light-outline\",\n \"alarm-multiple\",\n \"alarm-note\",\n \"alarm-note-off\",\n \"alarm-off\",\n \"alarm-panel\",\n \"alarm-panel-outline\",\n \"alarm-plus\",\n \"alarm-snooze\",\n \"album\",\n \"alert\",\n \"alert-box\",\n \"alert-box-outline\",\n \"alert-circle\",\n \"alert-circle-check\",\n \"alert-circle-check-outline\",\n \"alert-circle-outline\",\n \"alert-decagram\",\n \"alert-decagram-outline\",\n \"alert-minus\",\n \"alert-minus-outline\",\n \"alert-octagon\",\n \"alert-octagon-outline\",\n \"alert-octagram\",\n \"alert-octagram-outline\",\n \"alert-outline\",\n \"alert-plus\",\n \"alert-plus-outline\",\n \"alert-remove\",\n \"alert-remove-outline\",\n \"alert-rhombus\",\n \"alert-rhombus-outline\",\n \"alien\",\n \"alien-outline\",\n \"align-horizontal-center\",\n \"align-horizontal-distribute\",\n \"align-horizontal-left\",\n \"align-horizontal-right\",\n \"align-vertical-bottom\",\n \"align-vertical-center\",\n \"align-vertical-distribute\",\n \"align-vertical-top\",\n \"all-inclusive\",\n \"all-inclusive-box\",\n \"all-inclusive-box-outline\",\n \"allergy\",\n \"alpha\",\n \"alpha-a\",\n \"alpha-a-box\",\n \"alpha-a-box-outline\",\n \"alpha-a-circle\",\n \"alpha-a-circle-outline\",\n \"alpha-b\",\n \"alpha-b-box\",\n \"alpha-b-box-outline\",\n \"alpha-b-circle\",\n \"alpha-b-circle-outline\",\n \"alpha-c\",\n \"alpha-c-box\",\n \"alpha-c-box-outline\",\n \"alpha-c-circle\",\n \"alpha-c-circle-outline\",\n \"alpha-d\",\n \"alpha-d-box\",\n \"alpha-d-box-outline\",\n \"alpha-d-circle\",\n \"alpha-d-circle-outline\",\n \"alpha-e\",\n \"alpha-e-box\",\n \"alpha-e-box-outline\",\n \"alpha-e-circle\",\n \"alpha-e-circle-outline\",\n \"alpha-f\",\n \"alpha-f-box\",\n \"alpha-f-box-outline\",\n \"alpha-f-circle\",\n \"alpha-f-circle-outline\",\n \"alpha-g\",\n \"alpha-g-box\",\n \"alpha-g-box-outline\",\n \"alpha-g-circle\",\n \"alpha-g-circle-outline\",\n \"alpha-h\",\n \"alpha-h-box\",\n \"alpha-h-box-outline\",\n \"alpha-h-circle\",\n \"alpha-h-circle-outline\",\n \"alpha-i\",\n \"alpha-i-box\",\n \"alpha-i-box-outline\",\n \"alpha-i-circle\",\n \"alpha-i-circle-outline\",\n \"alpha-j\",\n \"alpha-j-box\",\n \"alpha-j-box-outline\",\n \"alpha-j-circle\",\n \"alpha-j-circle-outline\",\n \"alpha-k\",\n \"alpha-k-box\",\n \"alpha-k-box-outline\",\n \"alpha-k-circle\",\n \"alpha-k-circle-outline\",\n \"alpha-l\",\n \"alpha-l-box\",\n \"alpha-l-box-outline\",\n \"alpha-l-circle\",\n \"alpha-l-circle-outline\",\n \"alpha-m\",\n \"alpha-m-box\",\n \"alpha-m-box-outline\",\n \"alpha-m-circle\",\n \"alpha-m-circle-outline\",\n \"alpha-n\",\n \"alpha-n-box\",\n \"alpha-n-box-outline\",\n \"alpha-n-circle\",\n \"alpha-n-circle-outline\",\n \"alpha-o\",\n \"alpha-o-box\",\n \"alpha-o-box-outline\",\n \"alpha-o-circle\",\n \"alpha-o-circle-outline\",\n \"alpha-p\",\n \"alpha-p-box\",\n \"alpha-p-box-outline\",\n \"alpha-p-circle\",\n \"alpha-p-circle-outline\",\n \"alpha-q\",\n \"alpha-q-box\",\n \"alpha-q-box-outline\",\n \"alpha-q-circle\",\n \"alpha-q-circle-outline\",\n \"alpha-r\",\n \"alpha-r-box\",\n \"alpha-r-box-outline\",\n \"alpha-r-circle\",\n \"alpha-r-circle-outline\",\n \"alpha-s\",\n \"alpha-s-box\",\n \"alpha-s-box-outline\",\n \"alpha-s-circle\",\n \"alpha-s-circle-outline\",\n \"alpha-t\",\n \"alpha-t-box\",\n \"alpha-t-box-outline\",\n \"alpha-t-circle\",\n \"alpha-t-circle-outline\",\n \"alpha-u\",\n \"alpha-u-box\",\n \"alpha-u-box-outline\",\n \"alpha-u-circle\",\n \"alpha-u-circle-outline\",\n \"alpha-v\",\n \"alpha-v-box\",\n \"alpha-v-box-outline\",\n \"alpha-v-circle\",\n \"alpha-v-circle-outline\",\n \"alpha-w\",\n \"alpha-w-box\",\n \"alpha-w-box-outline\",\n \"alpha-w-circle\",\n \"alpha-w-circle-outline\",\n \"alpha-x\",\n \"alpha-x-box\",\n \"alpha-x-box-outline\",\n \"alpha-x-circle\",\n \"alpha-x-circle-outline\",\n \"alpha-y\",\n \"alpha-y-box\",\n \"alpha-y-box-outline\",\n \"alpha-y-circle\",\n \"alpha-y-circle-outline\",\n \"alpha-z\",\n \"alpha-z-box\",\n \"alpha-z-box-outline\",\n \"alpha-z-circle\",\n \"alpha-z-circle-outline\",\n \"alphabet-aurebesh\",\n \"alphabet-cyrillic\",\n \"alphabet-greek\",\n \"alphabet-latin\",\n \"alphabet-piqad\",\n \"alphabet-tengwar\",\n \"alphabetical\",\n \"alphabetical-off\",\n \"alphabetical-variant\",\n \"alphabetical-variant-off\",\n \"altimeter\",\n \"ambulance\",\n \"ammunition\",\n \"ampersand\",\n \"amplifier\",\n \"amplifier-off\",\n \"anchor\",\n \"android\",\n \"android-studio\",\n \"angle-acute\",\n \"angle-obtuse\",\n \"angle-right\",\n \"angular\",\n \"angularjs\",\n \"animation\",\n \"animation-outline\",\n \"animation-play\",\n \"animation-play-outline\",\n \"ansible\",\n \"antenna\",\n \"anvil\",\n \"apache-kafka\",\n \"api\",\n \"api-off\",\n \"apple\",\n \"apple-finder\",\n \"apple-icloud\",\n \"apple-ios\",\n \"apple-keyboard-caps\",\n \"apple-keyboard-command\",\n \"apple-keyboard-control\",\n \"apple-keyboard-option\",\n \"apple-keyboard-shift\",\n \"apple-safari\",\n \"application\",\n \"application-array\",\n \"application-array-outline\",\n \"application-braces\",\n \"application-braces-outline\",\n \"application-brackets\",\n \"application-brackets-outline\",\n \"application-cog\",\n \"application-cog-outline\",\n \"application-edit\",\n \"application-edit-outline\",\n \"application-export\",\n \"application-import\",\n \"application-outline\",\n \"application-parentheses\",\n \"application-parentheses-outline\",\n \"application-settings\",\n \"application-settings-outline\",\n \"application-variable\",\n \"application-variable-outline\",\n \"approximately-equal\",\n \"approximately-equal-box\",\n \"apps\",\n \"apps-box\",\n \"arch\",\n \"archive\",\n \"archive-alert\",\n \"archive-alert-outline\",\n \"archive-arrow-down\",\n \"archive-arrow-down-outline\",\n \"archive-arrow-up\",\n \"archive-arrow-up-outline\",\n \"archive-cancel\",\n \"archive-cancel-outline\",\n \"archive-check\",\n \"archive-check-outline\",\n \"archive-clock\",\n \"archive-clock-outline\",\n \"archive-cog\",\n \"archive-cog-outline\",\n \"archive-edit\",\n \"archive-edit-outline\",\n \"archive-eye\",\n \"archive-eye-outline\",\n \"archive-lock\",\n \"archive-lock-open\",\n \"archive-lock-open-outline\",\n \"archive-lock-outline\",\n \"archive-marker\",\n \"archive-marker-outline\",\n \"archive-minus\",\n \"archive-minus-outline\",\n \"archive-music\",\n \"archive-music-outline\",\n \"archive-off\",\n \"archive-off-outline\",\n \"archive-outline\",\n \"archive-plus\",\n \"archive-plus-outline\",\n \"archive-refresh\",\n \"archive-refresh-outline\",\n \"archive-remove\",\n \"archive-remove-outline\",\n \"archive-search\",\n \"archive-search-outline\",\n \"archive-settings\",\n \"archive-settings-outline\",\n \"archive-star\",\n \"archive-star-outline\",\n \"archive-sync\",\n \"archive-sync-outline\",\n \"arm-flex\",\n \"arm-flex-outline\",\n \"arrange-bring-forward\",\n \"arrange-bring-to-front\",\n \"arrange-send-backward\",\n \"arrange-send-to-back\",\n \"arrow-all\",\n \"arrow-bottom-left\",\n \"arrow-bottom-left-bold-box\",\n \"arrow-bottom-left-bold-box-outline\",\n \"arrow-bottom-left-bold-outline\",\n \"arrow-bottom-left-thick\",\n \"arrow-bottom-left-thin\",\n \"arrow-bottom-left-thin-circle-outline\",\n \"arrow-bottom-right\",\n \"arrow-bottom-right-bold-box\",\n \"arrow-bottom-right-bold-box-outline\",\n \"arrow-bottom-right-bold-outline\",\n \"arrow-bottom-right-thick\",\n \"arrow-bottom-right-thin\",\n \"arrow-bottom-right-thin-circle-outline\",\n \"arrow-collapse\",\n \"arrow-collapse-all\",\n \"arrow-collapse-down\",\n \"arrow-collapse-horizontal\",\n \"arrow-collapse-left\",\n \"arrow-collapse-right\",\n \"arrow-collapse-up\",\n \"arrow-collapse-vertical\",\n \"arrow-decision\",\n \"arrow-decision-auto\",\n \"arrow-decision-auto-outline\",\n \"arrow-decision-outline\",\n \"arrow-down\",\n \"arrow-down-bold\",\n \"arrow-down-bold-box\",\n \"arrow-down-bold-box-outline\",\n \"arrow-down-bold-circle\",\n \"arrow-down-bold-circle-outline\",\n \"arrow-down-bold-hexagon-outline\",\n \"arrow-down-bold-outline\",\n \"arrow-down-box\",\n \"arrow-down-circle\",\n \"arrow-down-circle-outline\",\n \"arrow-down-drop-circle\",\n \"arrow-down-drop-circle-outline\",\n \"arrow-down-left\",\n \"arrow-down-left-bold\",\n \"arrow-down-right\",\n \"arrow-down-right-bold\",\n \"arrow-down-thick\",\n \"arrow-down-thin\",\n \"arrow-down-thin-circle-outline\",\n \"arrow-expand\",\n \"arrow-expand-all\",\n \"arrow-expand-down\",\n \"arrow-expand-horizontal\",\n \"arrow-expand-left\",\n \"arrow-expand-right\",\n \"arrow-expand-up\",\n \"arrow-expand-vertical\",\n \"arrow-horizontal-lock\",\n \"arrow-left\",\n \"arrow-left-bold\",\n \"arrow-left-bold-box\",\n \"arrow-left-bold-box-outline\",\n \"arrow-left-bold-circle\",\n \"arrow-left-bold-circle-outline\",\n \"arrow-left-bold-hexagon-outline\",\n \"arrow-left-bold-outline\",\n \"arrow-left-bottom\",\n \"arrow-left-bottom-bold\",\n \"arrow-left-box\",\n \"arrow-left-circle\",\n \"arrow-left-circle-outline\",\n \"arrow-left-drop-circle\",\n \"arrow-left-drop-circle-outline\",\n \"arrow-left-right\",\n \"arrow-left-right-bold\",\n \"arrow-left-right-bold-outline\",\n \"arrow-left-thick\",\n \"arrow-left-thin\",\n \"arrow-left-thin-circle-outline\",\n \"arrow-left-top\",\n \"arrow-left-top-bold\",\n \"arrow-oscillating\",\n \"arrow-oscillating-off\",\n \"arrow-projectile\",\n \"arrow-projectile-multiple\",\n \"arrow-right\",\n \"arrow-right-bold\",\n \"arrow-right-bold-box\",\n \"arrow-right-bold-box-outline\",\n \"arrow-right-bold-circle\",\n \"arrow-right-bold-circle-outline\",\n \"arrow-right-bold-hexagon-outline\",\n \"arrow-right-bold-outline\",\n \"arrow-right-bottom\",\n \"arrow-right-bottom-bold\",\n \"arrow-right-box\",\n \"arrow-right-circle\",\n \"arrow-right-circle-outline\",\n \"arrow-right-drop-circle\",\n \"arrow-right-drop-circle-outline\",\n \"arrow-right-thick\",\n \"arrow-right-thin\",\n \"arrow-right-thin-circle-outline\",\n \"arrow-right-top\",\n \"arrow-right-top-bold\",\n \"arrow-split-horizontal\",\n \"arrow-split-vertical\",\n \"arrow-top-left\",\n \"arrow-top-left-bold-box\",\n \"arrow-top-left-bold-box-outline\",\n \"arrow-top-left-bold-outline\",\n \"arrow-top-left-bottom-right\",\n \"arrow-top-left-bottom-right-bold\",\n \"arrow-top-left-thick\",\n \"arrow-top-left-thin\",\n \"arrow-top-left-thin-circle-outline\",\n \"arrow-top-right\",\n \"arrow-top-right-bold-box\",\n \"arrow-top-right-bold-box-outline\",\n \"arrow-top-right-bold-outline\",\n \"arrow-top-right-bottom-left\",\n \"arrow-top-right-bottom-left-bold\",\n \"arrow-top-right-thick\",\n \"arrow-top-right-thin\",\n \"arrow-top-right-thin-circle-outline\",\n \"arrow-u-down-left\",\n \"arrow-u-down-left-bold\",\n \"arrow-u-down-right\",\n \"arrow-u-down-right-bold\",\n \"arrow-u-left-bottom\",\n \"arrow-u-left-bottom-bold\",\n \"arrow-u-left-top\",\n \"arrow-u-left-top-bold\",\n \"arrow-u-right-bottom\",\n \"arrow-u-right-bottom-bold\",\n \"arrow-u-right-top\",\n \"arrow-u-right-top-bold\",\n \"arrow-u-up-left\",\n \"arrow-u-up-left-bold\",\n \"arrow-u-up-right\",\n \"arrow-u-up-right-bold\",\n \"arrow-up\",\n \"arrow-up-bold\",\n \"arrow-up-bold-box\",\n \"arrow-up-bold-box-outline\",\n \"arrow-up-bold-circle\",\n \"arrow-up-bold-circle-outline\",\n \"arrow-up-bold-hexagon-outline\",\n \"arrow-up-bold-outline\",\n \"arrow-up-box\",\n \"arrow-up-circle\",\n \"arrow-up-circle-outline\",\n \"arrow-up-down\",\n \"arrow-up-down-bold\",\n \"arrow-up-down-bold-outline\",\n \"arrow-up-drop-circle\",\n \"arrow-up-drop-circle-outline\",\n \"arrow-up-left\",\n \"arrow-up-left-bold\",\n \"arrow-up-right\",\n \"arrow-up-right-bold\",\n \"arrow-up-thick\",\n \"arrow-up-thin\",\n \"arrow-up-thin-circle-outline\",\n \"arrow-vertical-lock\",\n \"artboard\",\n \"artstation\",\n \"aspect-ratio\",\n \"assistant\",\n \"asterisk\",\n \"asterisk-circle-outline\",\n \"at\",\n \"atlassian\",\n \"atm\",\n \"atom\",\n \"atom-variant\",\n \"attachment\",\n \"attachment-check\",\n \"attachment-lock\",\n \"attachment-minus\",\n \"attachment-off\",\n \"attachment-plus\",\n \"attachment-remove\",\n \"atv\",\n \"audio-input-rca\",\n \"audio-input-stereo-minijack\",\n \"audio-input-xlr\",\n \"audio-video\",\n \"audio-video-off\",\n \"augmented-reality\",\n \"aurora\",\n \"auto-download\",\n \"auto-fix\",\n \"auto-mode\",\n \"auto-upload\",\n \"autorenew\",\n \"autorenew-off\",\n \"av-timer\",\n \"awning\",\n \"awning-outline\",\n \"aws\",\n \"axe\",\n \"axe-battle\",\n \"axis\",\n \"axis-arrow\",\n \"axis-arrow-info\",\n \"axis-arrow-lock\",\n \"axis-lock\",\n \"axis-x-arrow\",\n \"axis-x-arrow-lock\",\n \"axis-x-rotate-clockwise\",\n \"axis-x-rotate-counterclockwise\",\n \"axis-x-y-arrow-lock\",\n \"axis-y-arrow\",\n \"axis-y-arrow-lock\",\n \"axis-y-rotate-clockwise\",\n \"axis-y-rotate-counterclockwise\",\n \"axis-z-arrow\",\n \"axis-z-arrow-lock\",\n \"axis-z-rotate-clockwise\",\n \"axis-z-rotate-counterclockwise\",\n \"babel\",\n \"baby\",\n \"baby-bottle\",\n \"baby-bottle-outline\",\n \"baby-buggy\",\n \"baby-buggy-off\",\n \"baby-carriage\",\n \"baby-carriage-off\",\n \"baby-face\",\n \"baby-face-outline\",\n \"backburger\",\n \"backspace\",\n \"backspace-outline\",\n \"backspace-reverse\",\n \"backspace-reverse-outline\",\n \"backup-restore\",\n \"bacteria\",\n \"bacteria-outline\",\n \"badge-account\",\n \"badge-account-alert\",\n \"badge-account-alert-outline\",\n \"badge-account-horizontal\",\n \"badge-account-horizontal-outline\",\n \"badge-account-outline\",\n \"badminton\",\n \"bag-carry-on\",\n \"bag-carry-on-check\",\n \"bag-carry-on-off\",\n \"bag-checked\",\n \"bag-personal\",\n \"bag-personal-off\",\n \"bag-personal-off-outline\",\n \"bag-personal-outline\",\n \"bag-personal-plus\",\n \"bag-personal-plus-outline\",\n \"bag-personal-tag\",\n \"bag-personal-tag-outline\",\n \"bag-suitcase\",\n \"bag-suitcase-off\",\n \"bag-suitcase-off-outline\",\n \"bag-suitcase-outline\",\n \"baguette\",\n \"balcony\",\n \"balloon\",\n \"ballot\",\n \"ballot-outline\",\n \"ballot-recount\",\n \"ballot-recount-outline\",\n \"bandage\",\n \"bank\",\n \"bank-check\",\n \"bank-circle\",\n \"bank-circle-outline\",\n \"bank-minus\",\n \"bank-off\",\n \"bank-off-outline\",\n \"bank-outline\",\n \"bank-plus\",\n \"bank-remove\",\n \"bank-transfer\",\n \"bank-transfer-in\",\n \"bank-transfer-out\",\n \"barcode\",\n \"barcode-off\",\n \"barcode-scan\",\n \"barley\",\n \"barley-off\",\n \"barn\",\n \"barrel\",\n \"barrel-outline\",\n \"baseball\",\n \"baseball-bat\",\n \"baseball-diamond\",\n \"baseball-diamond-outline\",\n \"baseball-outline\",\n \"bash\",\n \"basket\",\n \"basket-check\",\n \"basket-check-outline\",\n \"basket-fill\",\n \"basket-minus\",\n \"basket-minus-outline\",\n \"basket-off\",\n \"basket-off-outline\",\n \"basket-outline\",\n \"basket-plus\",\n \"basket-plus-outline\",\n \"basket-remove\",\n \"basket-remove-outline\",\n \"basket-unfill\",\n \"basketball\",\n \"basketball-hoop\",\n \"basketball-hoop-outline\",\n \"bat\",\n \"bathtub\",\n \"bathtub-outline\",\n \"battery\",\n \"battery-10\",\n \"battery-10-bluetooth\",\n \"battery-20\",\n \"battery-20-bluetooth\",\n \"battery-30\",\n \"battery-30-bluetooth\",\n \"battery-40\",\n \"battery-40-bluetooth\",\n \"battery-50\",\n \"battery-50-bluetooth\",\n \"battery-60\",\n \"battery-60-bluetooth\",\n \"battery-70\",\n \"battery-70-bluetooth\",\n \"battery-80\",\n \"battery-80-bluetooth\",\n \"battery-90\",\n \"battery-90-bluetooth\",\n \"battery-alert\",\n \"battery-alert-bluetooth\",\n \"battery-alert-variant\",\n \"battery-alert-variant-outline\",\n \"battery-arrow-down\",\n \"battery-arrow-down-outline\",\n \"battery-arrow-up\",\n \"battery-arrow-up-outline\",\n \"battery-bluetooth\",\n \"battery-bluetooth-variant\",\n \"battery-charging\",\n \"battery-charging-10\",\n \"battery-charging-100\",\n \"battery-charging-20\",\n \"battery-charging-30\",\n \"battery-charging-40\",\n \"battery-charging-50\",\n \"battery-charging-60\",\n \"battery-charging-70\",\n \"battery-charging-80\",\n \"battery-charging-90\",\n \"battery-charging-high\",\n \"battery-charging-low\",\n \"battery-charging-medium\",\n \"battery-charging-outline\",\n \"battery-charging-wireless\",\n \"battery-charging-wireless-10\",\n \"battery-charging-wireless-20\",\n \"battery-charging-wireless-30\",\n \"battery-charging-wireless-40\",\n \"battery-charging-wireless-50\",\n \"battery-charging-wireless-60\",\n \"battery-charging-wireless-70\",\n \"battery-charging-wireless-80\",\n \"battery-charging-wireless-90\",\n \"battery-charging-wireless-alert\",\n \"battery-charging-wireless-outline\",\n \"battery-check\",\n \"battery-check-outline\",\n \"battery-clock\",\n \"battery-clock-outline\",\n \"battery-heart\",\n \"battery-heart-outline\",\n \"battery-heart-variant\",\n \"battery-high\",\n \"battery-lock\",\n \"battery-lock-open\",\n \"battery-low\",\n \"battery-medium\",\n \"battery-minus\",\n \"battery-minus-outline\",\n \"battery-minus-variant\",\n \"battery-negative\",\n \"battery-off\",\n \"battery-off-outline\",\n \"battery-outline\",\n \"battery-plus\",\n \"battery-plus-outline\",\n \"battery-plus-variant\",\n \"battery-positive\",\n \"battery-remove\",\n \"battery-remove-outline\",\n \"battery-sync\",\n \"battery-sync-outline\",\n \"battery-unknown\",\n \"battery-unknown-bluetooth\",\n \"beach\",\n \"beaker\",\n \"beaker-alert\",\n \"beaker-alert-outline\",\n \"beaker-check\",\n \"beaker-check-outline\",\n \"beaker-minus\",\n \"beaker-minus-outline\",\n \"beaker-outline\",\n \"beaker-plus\",\n \"beaker-plus-outline\",\n \"beaker-question\",\n \"beaker-question-outline\",\n \"beaker-remove\",\n \"beaker-remove-outline\",\n \"bed\",\n \"bed-clock\",\n \"bed-double\",\n \"bed-double-outline\",\n \"bed-empty\",\n \"bed-king\",\n \"bed-king-outline\",\n \"bed-outline\",\n \"bed-queen\",\n \"bed-queen-outline\",\n \"bed-single\",\n \"bed-single-outline\",\n \"bee\",\n \"bee-flower\",\n \"beehive-off-outline\",\n \"beehive-outline\",\n \"beekeeper\",\n \"beer\",\n \"beer-outline\",\n \"bell\",\n \"bell-alert\",\n \"bell-alert-outline\",\n \"bell-badge\",\n \"bell-badge-outline\",\n \"bell-cancel\",\n \"bell-cancel-outline\",\n \"bell-check\",\n \"bell-check-outline\",\n \"bell-circle\",\n \"bell-circle-outline\",\n \"bell-cog\",\n \"bell-cog-outline\",\n \"bell-minus\",\n \"bell-minus-outline\",\n \"bell-off\",\n \"bell-off-outline\",\n \"bell-outline\",\n \"bell-plus\",\n \"bell-plus-outline\",\n \"bell-remove\",\n \"bell-remove-outline\",\n \"bell-ring\",\n \"bell-ring-outline\",\n \"bell-sleep\",\n \"bell-sleep-outline\",\n \"bench\",\n \"bench-back\",\n \"beta\",\n \"betamax\",\n \"biathlon\",\n \"bicycle\",\n \"bicycle-basket\",\n \"bicycle-cargo\",\n \"bicycle-electric\",\n \"bicycle-penny-farthing\",\n \"bike\",\n \"bike-fast\",\n \"bike-pedal\",\n \"bike-pedal-clipless\",\n \"bike-pedal-mountain\",\n \"billboard\",\n \"billiards\",\n \"billiards-rack\",\n \"binoculars\",\n \"bio\",\n \"biohazard\",\n \"bird\",\n \"bitbucket\",\n \"bitcoin\",\n \"black-mesa\",\n \"blender\",\n \"blender-outline\",\n \"blender-software\",\n \"blinds\",\n \"blinds-horizontal\",\n \"blinds-horizontal-closed\",\n \"blinds-open\",\n \"blinds-vertical\",\n \"blinds-vertical-closed\",\n \"block-helper\",\n \"blood-bag\",\n \"bluetooth\",\n \"bluetooth-audio\",\n \"bluetooth-connect\",\n \"bluetooth-off\",\n \"bluetooth-settings\",\n \"bluetooth-transfer\",\n \"blur\",\n \"blur-linear\",\n \"blur-off\",\n \"blur-radial\",\n \"bolt\",\n \"bomb\",\n \"bomb-off\",\n \"bone\",\n \"bone-off\",\n \"book\",\n \"book-account\",\n \"book-account-outline\",\n \"book-alert\",\n \"book-alert-outline\",\n \"book-alphabet\",\n \"book-arrow-down\",\n \"book-arrow-down-outline\",\n \"book-arrow-left\",\n \"book-arrow-left-outline\",\n \"book-arrow-right\",\n \"book-arrow-right-outline\",\n \"book-arrow-up\",\n \"book-arrow-up-outline\",\n \"book-cancel\",\n \"book-cancel-outline\",\n \"book-check\",\n \"book-check-outline\",\n \"book-clock\",\n \"book-clock-outline\",\n \"book-cog\",\n \"book-cog-outline\",\n \"book-cross\",\n \"book-edit\",\n \"book-edit-outline\",\n \"book-education\",\n \"book-education-outline\",\n \"book-heart\",\n \"book-heart-outline\",\n \"book-information-variant\",\n \"book-lock\",\n \"book-lock-open\",\n \"book-lock-open-outline\",\n \"book-lock-outline\",\n \"book-marker\",\n \"book-marker-outline\",\n \"book-minus\",\n \"book-minus-multiple\",\n \"book-minus-multiple-outline\",\n \"book-minus-outline\",\n \"book-multiple\",\n \"book-multiple-outline\",\n \"book-music\",\n \"book-music-outline\",\n \"book-off\",\n \"book-off-outline\",\n \"book-open\",\n \"book-open-blank-variant\",\n \"book-open-blank-variant-outline\",\n \"book-open-outline\",\n \"book-open-page-variant\",\n \"book-open-page-variant-outline\",\n \"book-open-variant\",\n \"book-open-variant-outline\",\n \"book-outline\",\n \"book-play\",\n \"book-play-outline\",\n \"book-plus\",\n \"book-plus-multiple\",\n \"book-plus-multiple-outline\",\n \"book-plus-outline\",\n \"book-refresh\",\n \"book-refresh-outline\",\n \"book-remove\",\n \"book-remove-multiple\",\n \"book-remove-multiple-outline\",\n \"book-remove-outline\",\n \"book-search\",\n \"book-search-outline\",\n \"book-settings\",\n \"book-settings-outline\",\n \"book-sync\",\n \"book-sync-outline\",\n \"book-variant\",\n \"bookmark\",\n \"bookmark-box\",\n \"bookmark-box-multiple\",\n \"bookmark-box-multiple-outline\",\n \"bookmark-box-outline\",\n \"bookmark-check\",\n \"bookmark-check-outline\",\n \"bookmark-minus\",\n \"bookmark-minus-outline\",\n \"bookmark-multiple\",\n \"bookmark-multiple-outline\",\n \"bookmark-music\",\n \"bookmark-music-outline\",\n \"bookmark-off\",\n \"bookmark-off-outline\",\n \"bookmark-outline\",\n \"bookmark-plus\",\n \"bookmark-plus-outline\",\n \"bookmark-remove\",\n \"bookmark-remove-outline\",\n \"bookshelf\",\n \"boom-gate\",\n \"boom-gate-alert\",\n \"boom-gate-alert-outline\",\n \"boom-gate-arrow-down\",\n \"boom-gate-arrow-down-outline\",\n \"boom-gate-arrow-up\",\n \"boom-gate-arrow-up-outline\",\n \"boom-gate-outline\",\n \"boom-gate-up\",\n \"boom-gate-up-outline\",\n \"boombox\",\n \"boomerang\",\n \"bootstrap\",\n \"border-all\",\n \"border-all-variant\",\n \"border-bottom\",\n \"border-bottom-variant\",\n \"border-color\",\n \"border-horizontal\",\n \"border-inside\",\n \"border-left\",\n \"border-left-variant\",\n \"border-none\",\n \"border-none-variant\",\n \"border-outside\",\n \"border-radius\",\n \"border-right\",\n \"border-right-variant\",\n \"border-style\",\n \"border-top\",\n \"border-top-variant\",\n \"border-vertical\",\n \"bottle-soda\",\n \"bottle-soda-classic\",\n \"bottle-soda-classic-outline\",\n \"bottle-soda-outline\",\n \"bottle-tonic\",\n \"bottle-tonic-outline\",\n \"bottle-tonic-plus\",\n \"bottle-tonic-plus-outline\",\n \"bottle-tonic-skull\",\n \"bottle-tonic-skull-outline\",\n \"bottle-wine\",\n \"bottle-wine-outline\",\n \"bow-arrow\",\n \"bow-tie\",\n \"bowl\",\n \"bowl-mix\",\n \"bowl-mix-outline\",\n \"bowl-outline\",\n \"bowling\",\n \"box\",\n \"box-cutter\",\n \"box-cutter-off\",\n \"box-shadow\",\n \"boxing-glove\",\n \"braille\",\n \"brain\",\n \"bread-slice\",\n \"bread-slice-outline\",\n \"bridge\",\n \"briefcase\",\n \"briefcase-account\",\n \"briefcase-account-outline\",\n \"briefcase-arrow-left-right\",\n \"briefcase-arrow-left-right-outline\",\n \"briefcase-arrow-up-down\",\n \"briefcase-arrow-up-down-outline\",\n \"briefcase-check\",\n \"briefcase-check-outline\",\n \"briefcase-clock\",\n \"briefcase-clock-outline\",\n \"briefcase-download\",\n \"briefcase-download-outline\",\n \"briefcase-edit\",\n \"briefcase-edit-outline\",\n \"briefcase-eye\",\n \"briefcase-eye-outline\",\n \"briefcase-minus\",\n \"briefcase-minus-outline\",\n \"briefcase-off\",\n \"briefcase-off-outline\",\n \"briefcase-outline\",\n \"briefcase-plus\",\n \"briefcase-plus-outline\",\n \"briefcase-remove\",\n \"briefcase-remove-outline\",\n \"briefcase-search\",\n \"briefcase-search-outline\",\n \"briefcase-upload\",\n \"briefcase-upload-outline\",\n \"briefcase-variant\",\n \"briefcase-variant-off\",\n \"briefcase-variant-off-outline\",\n \"briefcase-variant-outline\",\n \"brightness-1\",\n \"brightness-2\",\n \"brightness-3\",\n \"brightness-4\",\n \"brightness-5\",\n \"brightness-6\",\n \"brightness-7\",\n \"brightness-auto\",\n \"brightness-percent\",\n \"broadcast\",\n \"broadcast-off\",\n \"broom\",\n \"brush\",\n \"brush-off\",\n \"brush-outline\",\n \"brush-variant\",\n \"bucket\",\n \"bucket-outline\",\n \"buffet\",\n \"bug\",\n \"bug-check\",\n \"bug-check-outline\",\n \"bug-outline\",\n \"bug-pause\",\n \"bug-pause-outline\",\n \"bug-play\",\n \"bug-play-outline\",\n \"bug-stop\",\n \"bug-stop-outline\",\n \"bugle\",\n \"bulkhead-light\",\n \"bulldozer\",\n \"bullet\",\n \"bulletin-board\",\n \"bullhorn\",\n \"bullhorn-outline\",\n \"bullhorn-variant\",\n \"bullhorn-variant-outline\",\n \"bullseye\",\n \"bullseye-arrow\",\n \"bulma\",\n \"bunk-bed\",\n \"bunk-bed-outline\",\n \"bus\",\n \"bus-alert\",\n \"bus-articulated-end\",\n \"bus-articulated-front\",\n \"bus-clock\",\n \"bus-double-decker\",\n \"bus-electric\",\n \"bus-marker\",\n \"bus-multiple\",\n \"bus-school\",\n \"bus-side\",\n \"bus-sign\",\n \"bus-stop\",\n \"bus-stop-covered\",\n \"bus-stop-uncovered\",\n \"bus-wrench\",\n \"butterfly\",\n \"butterfly-outline\",\n \"button-cursor\",\n \"button-pointer\",\n \"cabin-a-frame\",\n \"cable-data\",\n \"cached\",\n \"cactus\",\n \"cake\",\n \"cake-layered\",\n \"cake-variant\",\n \"cake-variant-outline\",\n \"calculator\",\n \"calculator-variant\",\n \"calculator-variant-outline\",\n \"calendar\",\n \"calendar-account\",\n \"calendar-account-outline\",\n \"calendar-alert\",\n \"calendar-alert-outline\",\n \"calendar-arrow-left\",\n \"calendar-arrow-right\",\n \"calendar-badge\",\n \"calendar-badge-outline\",\n \"calendar-blank\",\n \"calendar-blank-multiple\",\n \"calendar-blank-outline\",\n \"calendar-check\",\n \"calendar-check-outline\",\n \"calendar-clock\",\n \"calendar-clock-outline\",\n \"calendar-collapse-horizontal\",\n \"calendar-collapse-horizontal-outline\",\n \"calendar-cursor\",\n \"calendar-cursor-outline\",\n \"calendar-edit\",\n \"calendar-edit-outline\",\n \"calendar-end\",\n \"calendar-end-outline\",\n \"calendar-expand-horizontal\",\n \"calendar-expand-horizontal-outline\",\n \"calendar-export\",\n \"calendar-export-outline\",\n \"calendar-filter\",\n \"calendar-filter-outline\",\n \"calendar-heart\",\n \"calendar-heart-outline\",\n \"calendar-import\",\n \"calendar-import-outline\",\n \"calendar-lock\",\n \"calendar-lock-open\",\n \"calendar-lock-open-outline\",\n \"calendar-lock-outline\",\n \"calendar-minus\",\n \"calendar-minus-outline\",\n \"calendar-month\",\n \"calendar-month-outline\",\n \"calendar-multiple\",\n \"calendar-multiple-check\",\n \"calendar-multiselect\",\n \"calendar-multiselect-outline\",\n \"calendar-outline\",\n \"calendar-plus\",\n \"calendar-plus-outline\",\n \"calendar-question\",\n \"calendar-question-outline\",\n \"calendar-range\",\n \"calendar-range-outline\",\n \"calendar-refresh\",\n \"calendar-refresh-outline\",\n \"calendar-remove\",\n \"calendar-remove-outline\",\n \"calendar-search\",\n \"calendar-search-outline\",\n \"calendar-star\",\n \"calendar-star-four-points\",\n \"calendar-star-outline\",\n \"calendar-start\",\n \"calendar-start-outline\",\n \"calendar-sync\",\n \"calendar-sync-outline\",\n \"calendar-text\",\n \"calendar-text-outline\",\n \"calendar-today\",\n \"calendar-today-outline\",\n \"calendar-week\",\n \"calendar-week-begin\",\n \"calendar-week-begin-outline\",\n \"calendar-week-outline\",\n \"calendar-weekend\",\n \"calendar-weekend-outline\",\n \"call-made\",\n \"call-merge\",\n \"call-missed\",\n \"call-received\",\n \"call-split\",\n \"camcorder\",\n \"camcorder-off\",\n \"camera\",\n \"camera-account\",\n \"camera-burst\",\n \"camera-control\",\n \"camera-document\",\n \"camera-document-off\",\n \"camera-enhance\",\n \"camera-enhance-outline\",\n \"camera-flip\",\n \"camera-flip-outline\",\n \"camera-front\",\n \"camera-front-variant\",\n \"camera-gopro\",\n \"camera-image\",\n \"camera-iris\",\n \"camera-lock\",\n \"camera-lock-open\",\n \"camera-lock-open-outline\",\n \"camera-lock-outline\",\n \"camera-marker\",\n \"camera-marker-outline\",\n \"camera-metering-center\",\n \"camera-metering-matrix\",\n \"camera-metering-partial\",\n \"camera-metering-spot\",\n \"camera-off\",\n \"camera-off-outline\",\n \"camera-outline\",\n \"camera-party-mode\",\n \"camera-plus\",\n \"camera-plus-outline\",\n \"camera-rear\",\n \"camera-rear-variant\",\n \"camera-retake\",\n \"camera-retake-outline\",\n \"camera-switch\",\n \"camera-switch-outline\",\n \"camera-timer\",\n \"camera-wireless\",\n \"camera-wireless-outline\",\n \"campfire\",\n \"cancel\",\n \"candelabra\",\n \"candelabra-fire\",\n \"candle\",\n \"candy\",\n \"candy-off\",\n \"candy-off-outline\",\n \"candy-outline\",\n \"candycane\",\n \"cannabis\",\n \"cannabis-off\",\n \"caps-lock\",\n \"car\",\n \"car-2-plus\",\n \"car-3-plus\",\n \"car-arrow-left\",\n \"car-arrow-right\",\n \"car-back\",\n \"car-battery\",\n \"car-brake-abs\",\n \"car-brake-alert\",\n \"car-brake-fluid-level\",\n \"car-brake-hold\",\n \"car-brake-low-pressure\",\n \"car-brake-parking\",\n \"car-brake-retarder\",\n \"car-brake-temperature\",\n \"car-brake-worn-linings\",\n \"car-child-seat\",\n \"car-clock\",\n \"car-clutch\",\n \"car-cog\",\n \"car-connected\",\n \"car-convertible\",\n \"car-coolant-level\",\n \"car-cruise-control\",\n \"car-defrost-front\",\n \"car-defrost-rear\",\n \"car-door\",\n \"car-door-lock\",\n \"car-door-lock-open\",\n \"car-electric\",\n \"car-electric-outline\",\n \"car-emergency\",\n \"car-esp\",\n \"car-estate\",\n \"car-hatchback\",\n \"car-info\",\n \"car-key\",\n \"car-lifted-pickup\",\n \"car-light-alert\",\n \"car-light-dimmed\",\n \"car-light-fog\",\n \"car-light-high\",\n \"car-limousine\",\n \"car-multiple\",\n \"car-off\",\n \"car-outline\",\n \"car-parking-lights\",\n \"car-pickup\",\n \"car-search\",\n \"car-search-outline\",\n \"car-seat\",\n \"car-seat-cooler\",\n \"car-seat-heater\",\n \"car-select\",\n \"car-settings\",\n \"car-shift-pattern\",\n \"car-side\",\n \"car-speed-limiter\",\n \"car-sports\",\n \"car-tire-alert\",\n \"car-traction-control\",\n \"car-turbocharger\",\n \"car-wash\",\n \"car-windshield\",\n \"car-windshield-outline\",\n \"car-wireless\",\n \"car-wrench\",\n \"carabiner\",\n \"caravan\",\n \"card\",\n \"card-account-details\",\n \"card-account-details-outline\",\n \"card-account-details-star\",\n \"card-account-details-star-outline\",\n \"card-account-mail\",\n \"card-account-mail-outline\",\n \"card-account-phone\",\n \"card-account-phone-outline\",\n \"card-bulleted\",\n \"card-bulleted-off\",\n \"card-bulleted-off-outline\",\n \"card-bulleted-outline\",\n \"card-bulleted-settings\",\n \"card-bulleted-settings-outline\",\n \"card-minus\",\n \"card-minus-outline\",\n \"card-multiple\",\n \"card-multiple-outline\",\n \"card-off\",\n \"card-off-outline\",\n \"card-outline\",\n \"card-plus\",\n \"card-plus-outline\",\n \"card-remove\",\n \"card-remove-outline\",\n \"card-search\",\n \"card-search-outline\",\n \"card-text\",\n \"card-text-outline\",\n \"cards\",\n \"cards-club\",\n \"cards-club-outline\",\n \"cards-diamond\",\n \"cards-diamond-outline\",\n \"cards-heart\",\n \"cards-heart-outline\",\n \"cards-outline\",\n \"cards-playing\",\n \"cards-playing-club\",\n \"cards-playing-club-multiple\",\n \"cards-playing-club-multiple-outline\",\n \"cards-playing-club-outline\",\n \"cards-playing-diamond\",\n \"cards-playing-diamond-multiple\",\n \"cards-playing-diamond-multiple-outline\",\n \"cards-playing-diamond-outline\",\n \"cards-playing-heart\",\n \"cards-playing-heart-multiple\",\n \"cards-playing-heart-multiple-outline\",\n \"cards-playing-heart-outline\",\n \"cards-playing-outline\",\n \"cards-playing-spade\",\n \"cards-playing-spade-multiple\",\n \"cards-playing-spade-multiple-outline\",\n \"cards-playing-spade-outline\",\n \"cards-spade\",\n \"cards-spade-outline\",\n \"cards-variant\",\n \"carrot\",\n \"cart\",\n \"cart-arrow-down\",\n \"cart-arrow-right\",\n \"cart-arrow-up\",\n \"cart-check\",\n \"cart-heart\",\n \"cart-minus\",\n \"cart-off\",\n \"cart-outline\",\n \"cart-percent\",\n \"cart-plus\",\n \"cart-remove\",\n \"cart-variant\",\n \"case-sensitive-alt\",\n \"cash\",\n \"cash-100\",\n \"cash-check\",\n \"cash-clock\",\n \"cash-edit\",\n \"cash-fast\",\n \"cash-lock\",\n \"cash-lock-open\",\n \"cash-marker\",\n \"cash-minus\",\n \"cash-multiple\",\n \"cash-off\",\n \"cash-plus\",\n \"cash-refund\",\n \"cash-register\",\n \"cash-remove\",\n \"cash-sync\",\n \"cassette\",\n \"cast\",\n \"cast-audio\",\n \"cast-audio-variant\",\n \"cast-connected\",\n \"cast-education\",\n \"cast-off\",\n \"cast-variant\",\n \"castle\",\n \"cat\",\n \"cctv\",\n \"cctv-off\",\n \"ceiling-fan\",\n \"ceiling-fan-light\",\n \"ceiling-light\",\n \"ceiling-light-multiple\",\n \"ceiling-light-multiple-outline\",\n \"ceiling-light-outline\",\n \"cellphone\",\n \"cellphone-arrow-down\",\n \"cellphone-arrow-down-variant\",\n \"cellphone-basic\",\n \"cellphone-charging\",\n \"cellphone-check\",\n \"cellphone-cog\",\n \"cellphone-dock\",\n \"cellphone-information\",\n \"cellphone-key\",\n \"cellphone-link\",\n \"cellphone-link-off\",\n \"cellphone-lock\",\n \"cellphone-marker\",\n \"cellphone-message\",\n \"cellphone-message-off\",\n \"cellphone-nfc\",\n \"cellphone-nfc-off\",\n \"cellphone-off\",\n \"cellphone-play\",\n \"cellphone-remove\",\n \"cellphone-screenshot\",\n \"cellphone-settings\",\n \"cellphone-sound\",\n \"cellphone-text\",\n \"cellphone-wireless\",\n \"centos\",\n \"certificate\",\n \"certificate-outline\",\n \"chair-rolling\",\n \"chair-school\",\n \"chandelier\",\n \"charity\",\n \"charity-search\",\n \"chart-arc\",\n \"chart-areaspline\",\n \"chart-areaspline-variant\",\n \"chart-bar\",\n \"chart-bar-stacked\",\n \"chart-bell-curve\",\n \"chart-bell-curve-cumulative\",\n \"chart-box\",\n \"chart-box-multiple\",\n \"chart-box-multiple-outline\",\n \"chart-box-outline\",\n \"chart-box-plus-outline\",\n \"chart-bubble\",\n \"chart-donut\",\n \"chart-donut-variant\",\n \"chart-gantt\",\n \"chart-histogram\",\n \"chart-line\",\n \"chart-line-stacked\",\n \"chart-line-variant\",\n \"chart-multiline\",\n \"chart-multiple\",\n \"chart-pie\",\n \"chart-pie-outline\",\n \"chart-ppf\",\n \"chart-sankey\",\n \"chart-sankey-variant\",\n \"chart-scatter-plot\",\n \"chart-scatter-plot-hexbin\",\n \"chart-timeline\",\n \"chart-timeline-variant\",\n \"chart-timeline-variant-shimmer\",\n \"chart-tree\",\n \"chart-waterfall\",\n \"chat\",\n \"chat-alert\",\n \"chat-alert-outline\",\n \"chat-minus\",\n \"chat-minus-outline\",\n \"chat-outline\",\n \"chat-plus\",\n \"chat-plus-outline\",\n \"chat-processing\",\n \"chat-processing-outline\",\n \"chat-question\",\n \"chat-question-outline\",\n \"chat-remove\",\n \"chat-remove-outline\",\n \"chat-sleep\",\n \"chat-sleep-outline\",\n \"check\",\n \"check-all\",\n \"check-bold\",\n \"check-circle\",\n \"check-circle-outline\",\n \"check-decagram\",\n \"check-decagram-outline\",\n \"check-network\",\n \"check-network-outline\",\n \"check-outline\",\n \"check-underline\",\n \"check-underline-circle\",\n \"check-underline-circle-outline\",\n \"checkbook\",\n \"checkbook-arrow-left\",\n \"checkbook-arrow-right\",\n \"checkbox-blank\",\n \"checkbox-blank-badge\",\n \"checkbox-blank-badge-outline\",\n \"checkbox-blank-circle\",\n \"checkbox-blank-circle-outline\",\n \"checkbox-blank-off\",\n \"checkbox-blank-off-outline\",\n \"checkbox-blank-outline\",\n \"checkbox-intermediate\",\n \"checkbox-intermediate-variant\",\n \"checkbox-marked\",\n \"checkbox-marked-circle\",\n \"checkbox-marked-circle-auto-outline\",\n \"checkbox-marked-circle-minus-outline\",\n \"checkbox-marked-circle-outline\",\n \"checkbox-marked-circle-plus-outline\",\n \"checkbox-marked-outline\",\n \"checkbox-multiple-blank\",\n \"checkbox-multiple-blank-circle\",\n \"checkbox-multiple-blank-circle-outline\",\n \"checkbox-multiple-blank-outline\",\n \"checkbox-multiple-marked\",\n \"checkbox-multiple-marked-circle\",\n \"checkbox-multiple-marked-circle-outline\",\n \"checkbox-multiple-marked-outline\",\n \"checkbox-multiple-outline\",\n \"checkbox-outline\",\n \"checkerboard\",\n \"checkerboard-minus\",\n \"checkerboard-plus\",\n \"checkerboard-remove\",\n \"cheese\",\n \"cheese-off\",\n \"chef-hat\",\n \"chemical-weapon\",\n \"chess-bishop\",\n \"chess-king\",\n \"chess-knight\",\n \"chess-pawn\",\n \"chess-queen\",\n \"chess-rook\",\n \"chevron-double-down\",\n \"chevron-double-left\",\n \"chevron-double-right\",\n \"chevron-double-up\",\n \"chevron-down\",\n \"chevron-down-box\",\n \"chevron-down-box-outline\",\n \"chevron-down-circle\",\n \"chevron-down-circle-outline\",\n \"chevron-left\",\n \"chevron-left-box\",\n \"chevron-left-box-outline\",\n \"chevron-left-circle\",\n \"chevron-left-circle-outline\",\n \"chevron-right\",\n \"chevron-right-box\",\n \"chevron-right-box-outline\",\n \"chevron-right-circle\",\n \"chevron-right-circle-outline\",\n \"chevron-triple-down\",\n \"chevron-triple-left\",\n \"chevron-triple-right\",\n \"chevron-triple-up\",\n \"chevron-up\",\n \"chevron-up-box\",\n \"chevron-up-box-outline\",\n \"chevron-up-circle\",\n \"chevron-up-circle-outline\",\n \"chili-alert\",\n \"chili-alert-outline\",\n \"chili-hot\",\n \"chili-hot-outline\",\n \"chili-medium\",\n \"chili-medium-outline\",\n \"chili-mild\",\n \"chili-mild-outline\",\n \"chili-off\",\n \"chili-off-outline\",\n \"chip\",\n \"church\",\n \"church-outline\",\n \"cigar\",\n \"cigar-off\",\n \"circle\",\n \"circle-box\",\n \"circle-box-outline\",\n \"circle-double\",\n \"circle-edit-outline\",\n \"circle-expand\",\n \"circle-half\",\n \"circle-half-full\",\n \"circle-medium\",\n \"circle-multiple\",\n \"circle-multiple-outline\",\n \"circle-off-outline\",\n \"circle-opacity\",\n \"circle-outline\",\n \"circle-slice-1\",\n \"circle-slice-2\",\n \"circle-slice-3\",\n \"circle-slice-4\",\n \"circle-slice-5\",\n \"circle-slice-6\",\n \"circle-slice-7\",\n \"circle-slice-8\",\n \"circle-small\",\n \"circular-saw\",\n \"city\",\n \"city-switch\",\n \"city-variant\",\n \"city-variant-outline\",\n \"clipboard\",\n \"clipboard-account\",\n \"clipboard-account-outline\",\n \"clipboard-alert\",\n \"clipboard-alert-outline\",\n \"clipboard-arrow-down\",\n \"clipboard-arrow-down-outline\",\n \"clipboard-arrow-left\",\n \"clipboard-arrow-left-outline\",\n \"clipboard-arrow-right\",\n \"clipboard-arrow-right-outline\",\n \"clipboard-arrow-up\",\n \"clipboard-arrow-up-outline\",\n \"clipboard-check\",\n \"clipboard-check-multiple\",\n \"clipboard-check-multiple-outline\",\n \"clipboard-check-outline\",\n \"clipboard-clock\",\n \"clipboard-clock-outline\",\n \"clipboard-edit\",\n \"clipboard-edit-outline\",\n \"clipboard-file\",\n \"clipboard-file-outline\",\n \"clipboard-flow\",\n \"clipboard-flow-outline\",\n \"clipboard-list\",\n \"clipboard-list-outline\",\n \"clipboard-minus\",\n \"clipboard-minus-outline\",\n \"clipboard-multiple\",\n \"clipboard-multiple-outline\",\n \"clipboard-off\",\n \"clipboard-off-outline\",\n \"clipboard-outline\",\n \"clipboard-play\",\n \"clipboard-play-multiple\",\n \"clipboard-play-multiple-outline\",\n \"clipboard-play-outline\",\n \"clipboard-plus\",\n \"clipboard-plus-outline\",\n \"clipboard-pulse\",\n \"clipboard-pulse-outline\",\n \"clipboard-remove\",\n \"clipboard-remove-outline\",\n \"clipboard-search\",\n \"clipboard-search-outline\",\n \"clipboard-text\",\n \"clipboard-text-clock\",\n \"clipboard-text-clock-outline\",\n \"clipboard-text-multiple\",\n \"clipboard-text-multiple-outline\",\n \"clipboard-text-off\",\n \"clipboard-text-off-outline\",\n \"clipboard-text-outline\",\n \"clipboard-text-play\",\n \"clipboard-text-play-outline\",\n \"clipboard-text-search\",\n \"clipboard-text-search-outline\",\n \"clippy\",\n \"clock\",\n \"clock-alert\",\n \"clock-alert-outline\",\n \"clock-check\",\n \"clock-check-outline\",\n \"clock-digital\",\n \"clock-edit\",\n \"clock-edit-outline\",\n \"clock-end\",\n \"clock-fast\",\n \"clock-in\",\n \"clock-minus\",\n \"clock-minus-outline\",\n \"clock-out\",\n \"clock-outline\",\n \"clock-plus\",\n \"clock-plus-outline\",\n \"clock-remove\",\n \"clock-remove-outline\",\n \"clock-star-four-points\",\n \"clock-star-four-points-outline\",\n \"clock-start\",\n \"clock-time-eight\",\n \"clock-time-eight-outline\",\n \"clock-time-eleven\",\n \"clock-time-eleven-outline\",\n \"clock-time-five\",\n \"clock-time-five-outline\",\n \"clock-time-four\",\n \"clock-time-four-outline\",\n \"clock-time-nine\",\n \"clock-time-nine-outline\",\n \"clock-time-one\",\n \"clock-time-one-outline\",\n \"clock-time-seven\",\n \"clock-time-seven-outline\",\n \"clock-time-six\",\n \"clock-time-six-outline\",\n \"clock-time-ten\",\n \"clock-time-ten-outline\",\n \"clock-time-three\",\n \"clock-time-three-outline\",\n \"clock-time-twelve\",\n \"clock-time-twelve-outline\",\n \"clock-time-two\",\n \"clock-time-two-outline\",\n \"close\",\n \"close-box\",\n \"close-box-multiple\",\n \"close-box-multiple-outline\",\n \"close-box-outline\",\n \"close-circle\",\n \"close-circle-multiple\",\n \"close-circle-multiple-outline\",\n \"close-circle-outline\",\n \"close-network\",\n \"close-network-outline\",\n \"close-octagon\",\n \"close-octagon-outline\",\n \"close-outline\",\n \"close-thick\",\n \"closed-caption\",\n \"closed-caption-outline\",\n \"cloud\",\n \"cloud-alert\",\n \"cloud-alert-outline\",\n \"cloud-arrow-down\",\n \"cloud-arrow-down-outline\",\n \"cloud-arrow-left\",\n \"cloud-arrow-left-outline\",\n \"cloud-arrow-right\",\n \"cloud-arrow-right-outline\",\n \"cloud-arrow-up\",\n \"cloud-arrow-up-outline\",\n \"cloud-braces\",\n \"cloud-cancel\",\n \"cloud-cancel-outline\",\n \"cloud-check\",\n \"cloud-check-outline\",\n \"cloud-check-variant\",\n \"cloud-check-variant-outline\",\n \"cloud-circle\",\n \"cloud-circle-outline\",\n \"cloud-clock\",\n \"cloud-clock-outline\",\n \"cloud-cog\",\n \"cloud-cog-outline\",\n \"cloud-download\",\n \"cloud-download-outline\",\n \"cloud-key\",\n \"cloud-key-outline\",\n \"cloud-lock\",\n \"cloud-lock-open\",\n \"cloud-lock-open-outline\",\n \"cloud-lock-outline\",\n \"cloud-minus\",\n \"cloud-minus-outline\",\n \"cloud-off\",\n \"cloud-off-outline\",\n \"cloud-outline\",\n \"cloud-percent\",\n \"cloud-percent-outline\",\n \"cloud-plus\",\n \"cloud-plus-outline\",\n \"cloud-print\",\n \"cloud-print-outline\",\n \"cloud-question\",\n \"cloud-question-outline\",\n \"cloud-refresh\",\n \"cloud-refresh-outline\",\n \"cloud-refresh-variant\",\n \"cloud-refresh-variant-outline\",\n \"cloud-remove\",\n \"cloud-remove-outline\",\n \"cloud-search\",\n \"cloud-search-outline\",\n \"cloud-sync\",\n \"cloud-sync-outline\",\n \"cloud-tags\",\n \"cloud-upload\",\n \"cloud-upload-outline\",\n \"clouds\",\n \"clover\",\n \"clover-outline\",\n \"coach-lamp\",\n \"coach-lamp-variant\",\n \"coat-rack\",\n \"code-array\",\n \"code-block-braces\",\n \"code-block-brackets\",\n \"code-block-parentheses\",\n \"code-block-tags\",\n \"code-braces\",\n \"code-braces-box\",\n \"code-brackets\",\n \"code-equal\",\n \"code-greater-than\",\n \"code-greater-than-or-equal\",\n \"code-json\",\n \"code-less-than\",\n \"code-less-than-or-equal\",\n \"code-not-equal\",\n \"code-not-equal-variant\",\n \"code-parentheses\",\n \"code-parentheses-box\",\n \"code-string\",\n \"code-tags\",\n \"code-tags-check\",\n \"codepen\",\n \"coffee\",\n \"coffee-maker\",\n \"coffee-maker-check\",\n \"coffee-maker-check-outline\",\n \"coffee-maker-outline\",\n \"coffee-off\",\n \"coffee-off-outline\",\n \"coffee-outline\",\n \"coffee-to-go\",\n \"coffee-to-go-outline\",\n \"coffin\",\n \"cog\",\n \"cog-box\",\n \"cog-clockwise\",\n \"cog-counterclockwise\",\n \"cog-off\",\n \"cog-off-outline\",\n \"cog-outline\",\n \"cog-pause\",\n \"cog-pause-outline\",\n \"cog-play\",\n \"cog-play-outline\",\n \"cog-refresh\",\n \"cog-refresh-outline\",\n \"cog-stop\",\n \"cog-stop-outline\",\n \"cog-sync\",\n \"cog-sync-outline\",\n \"cog-transfer\",\n \"cog-transfer-outline\",\n \"cogs\",\n \"collage\",\n \"collapse-all\",\n \"collapse-all-outline\",\n \"color-helper\",\n \"comma\",\n \"comma-box\",\n \"comma-box-outline\",\n \"comma-circle\",\n \"comma-circle-outline\",\n \"comment\",\n \"comment-account\",\n \"comment-account-outline\",\n \"comment-alert\",\n \"comment-alert-outline\",\n \"comment-arrow-left\",\n \"comment-arrow-left-outline\",\n \"comment-arrow-right\",\n \"comment-arrow-right-outline\",\n \"comment-bookmark\",\n \"comment-bookmark-outline\",\n \"comment-check\",\n \"comment-check-outline\",\n \"comment-edit\",\n \"comment-edit-outline\",\n \"comment-eye\",\n \"comment-eye-outline\",\n \"comment-flash\",\n \"comment-flash-outline\",\n \"comment-minus\",\n \"comment-minus-outline\",\n \"comment-multiple\",\n \"comment-multiple-outline\",\n \"comment-off\",\n \"comment-off-outline\",\n \"comment-outline\",\n \"comment-plus\",\n \"comment-plus-outline\",\n \"comment-processing\",\n \"comment-processing-outline\",\n \"comment-question\",\n \"comment-question-outline\",\n \"comment-quote\",\n \"comment-quote-outline\",\n \"comment-remove\",\n \"comment-remove-outline\",\n \"comment-search\",\n \"comment-search-outline\",\n \"comment-text\",\n \"comment-text-multiple\",\n \"comment-text-multiple-outline\",\n \"comment-text-outline\",\n \"compare\",\n \"compare-horizontal\",\n \"compare-remove\",\n \"compare-vertical\",\n \"compass\",\n \"compass-off\",\n \"compass-off-outline\",\n \"compass-outline\",\n \"compass-rose\",\n \"compost\",\n \"cone\",\n \"cone-off\",\n \"connection\",\n \"console\",\n \"console-line\",\n \"console-network\",\n \"console-network-outline\",\n \"consolidate\",\n \"contactless-payment\",\n \"contactless-payment-circle\",\n \"contactless-payment-circle-outline\",\n \"contacts\",\n \"contacts-outline\",\n \"contain\",\n \"contain-end\",\n \"contain-start\",\n \"content-copy\",\n \"content-cut\",\n \"content-duplicate\",\n \"content-paste\",\n \"content-save\",\n \"content-save-alert\",\n \"content-save-alert-outline\",\n \"content-save-all\",\n \"content-save-all-outline\",\n \"content-save-check\",\n \"content-save-check-outline\",\n \"content-save-cog\",\n \"content-save-cog-outline\",\n \"content-save-edit\",\n \"content-save-edit-outline\",\n \"content-save-minus\",\n \"content-save-minus-outline\",\n \"content-save-move\",\n \"content-save-move-outline\",\n \"content-save-off\",\n \"content-save-off-outline\",\n \"content-save-outline\",\n \"content-save-plus\",\n \"content-save-plus-outline\",\n \"content-save-settings\",\n \"content-save-settings-outline\",\n \"contrast\",\n \"contrast-box\",\n \"contrast-circle\",\n \"controller\",\n \"controller-classic\",\n \"controller-classic-outline\",\n \"controller-off\",\n \"cookie\",\n \"cookie-alert\",\n \"cookie-alert-outline\",\n \"cookie-check\",\n \"cookie-check-outline\",\n \"cookie-clock\",\n \"cookie-clock-outline\",\n \"cookie-cog\",\n \"cookie-cog-outline\",\n \"cookie-edit\",\n \"cookie-edit-outline\",\n \"cookie-lock\",\n \"cookie-lock-outline\",\n \"cookie-minus\",\n \"cookie-minus-outline\",\n \"cookie-off\",\n \"cookie-off-outline\",\n \"cookie-outline\",\n \"cookie-plus\",\n \"cookie-plus-outline\",\n \"cookie-refresh\",\n \"cookie-refresh-outline\",\n \"cookie-remove\",\n \"cookie-remove-outline\",\n \"cookie-settings\",\n \"cookie-settings-outline\",\n \"coolant-temperature\",\n \"copyleft\",\n \"copyright\",\n \"cordova\",\n \"corn\",\n \"corn-off\",\n \"cosine-wave\",\n \"counter\",\n \"countertop\",\n \"countertop-outline\",\n \"cow\",\n \"cow-off\",\n \"cpu-32-bit\",\n \"cpu-64-bit\",\n \"cradle\",\n \"cradle-outline\",\n \"crane\",\n \"creation\",\n \"creation-outline\",\n \"creative-commons\",\n \"credit-card\",\n \"credit-card-check\",\n \"credit-card-check-outline\",\n \"credit-card-chip\",\n \"credit-card-chip-outline\",\n \"credit-card-clock\",\n \"credit-card-clock-outline\",\n \"credit-card-edit\",\n \"credit-card-edit-outline\",\n \"credit-card-fast\",\n \"credit-card-fast-outline\",\n \"credit-card-lock\",\n \"credit-card-lock-outline\",\n \"credit-card-marker\",\n \"credit-card-marker-outline\",\n \"credit-card-minus\",\n \"credit-card-minus-outline\",\n \"credit-card-multiple\",\n \"credit-card-multiple-outline\",\n \"credit-card-off\",\n \"credit-card-off-outline\",\n \"credit-card-outline\",\n \"credit-card-plus\",\n \"credit-card-plus-outline\",\n \"credit-card-refresh\",\n \"credit-card-refresh-outline\",\n \"credit-card-refund\",\n \"credit-card-refund-outline\",\n \"credit-card-remove\",\n \"credit-card-remove-outline\",\n \"credit-card-scan\",\n \"credit-card-scan-outline\",\n \"credit-card-search\",\n \"credit-card-search-outline\",\n \"credit-card-settings\",\n \"credit-card-settings-outline\",\n \"credit-card-sync\",\n \"credit-card-sync-outline\",\n \"credit-card-wireless\",\n \"credit-card-wireless-off\",\n \"credit-card-wireless-off-outline\",\n \"credit-card-wireless-outline\",\n \"cricket\",\n \"crop\",\n \"crop-free\",\n \"crop-landscape\",\n \"crop-portrait\",\n \"crop-rotate\",\n \"crop-square\",\n \"cross\",\n \"cross-bolnisi\",\n \"cross-celtic\",\n \"cross-outline\",\n \"crosshairs\",\n \"crosshairs-gps\",\n \"crosshairs-off\",\n \"crosshairs-question\",\n \"crowd\",\n \"crown\",\n \"crown-circle\",\n \"crown-circle-outline\",\n \"crown-outline\",\n \"cryengine\",\n \"crystal-ball\",\n \"cube\",\n \"cube-off\",\n \"cube-off-outline\",\n \"cube-outline\",\n \"cube-scan\",\n \"cube-send\",\n \"cube-unfolded\",\n \"cup\",\n \"cup-off\",\n \"cup-off-outline\",\n \"cup-outline\",\n \"cup-water\",\n \"cupboard\",\n \"cupboard-outline\",\n \"cupcake\",\n \"curling\",\n \"currency-bdt\",\n \"currency-brl\",\n \"currency-btc\",\n \"currency-cny\",\n \"currency-eth\",\n \"currency-eur\",\n \"currency-eur-off\",\n \"currency-fra\",\n \"currency-gbp\",\n \"currency-ils\",\n \"currency-inr\",\n \"currency-jpy\",\n \"currency-krw\",\n \"currency-kzt\",\n \"currency-mnt\",\n \"currency-ngn\",\n \"currency-php\",\n \"currency-rial\",\n \"currency-rub\",\n \"currency-rupee\",\n \"currency-sign\",\n \"currency-thb\",\n \"currency-try\",\n \"currency-twd\",\n \"currency-uah\",\n \"currency-usd\",\n \"currency-usd-off\",\n \"current-ac\",\n \"current-dc\",\n \"cursor-default\",\n \"cursor-default-click\",\n \"cursor-default-click-outline\",\n \"cursor-default-gesture\",\n \"cursor-default-gesture-outline\",\n \"cursor-default-outline\",\n \"cursor-move\",\n \"cursor-pointer\",\n \"cursor-text\",\n \"curtains\",\n \"curtains-closed\",\n \"cylinder\",\n \"cylinder-off\",\n \"dance-ballroom\",\n \"dance-pole\",\n \"data-matrix\",\n \"data-matrix-edit\",\n \"data-matrix-minus\",\n \"data-matrix-plus\",\n \"data-matrix-remove\",\n \"data-matrix-scan\",\n \"database\",\n \"database-alert\",\n \"database-alert-outline\",\n \"database-arrow-down\",\n \"database-arrow-down-outline\",\n \"database-arrow-left\",\n \"database-arrow-left-outline\",\n \"database-arrow-right\",\n \"database-arrow-right-outline\",\n \"database-arrow-up\",\n \"database-arrow-up-outline\",\n \"database-check\",\n \"database-check-outline\",\n \"database-clock\",\n \"database-clock-outline\",\n \"database-cog\",\n \"database-cog-outline\",\n \"database-edit\",\n \"database-edit-outline\",\n \"database-export\",\n \"database-export-outline\",\n \"database-eye\",\n \"database-eye-off\",\n \"database-eye-off-outline\",\n \"database-eye-outline\",\n \"database-import\",\n \"database-import-outline\",\n \"database-lock\",\n \"database-lock-outline\",\n \"database-marker\",\n \"database-marker-outline\",\n \"database-minus\",\n \"database-minus-outline\",\n \"database-off\",\n \"database-off-outline\",\n \"database-outline\",\n \"database-plus\",\n \"database-plus-outline\",\n \"database-refresh\",\n \"database-refresh-outline\",\n \"database-remove\",\n \"database-remove-outline\",\n \"database-search\",\n \"database-search-outline\",\n \"database-settings\",\n \"database-settings-outline\",\n \"database-sync\",\n \"database-sync-outline\",\n \"death-star\",\n \"death-star-variant\",\n \"deathly-hallows\",\n \"debian\",\n \"debug-step-into\",\n \"debug-step-out\",\n \"debug-step-over\",\n \"decagram\",\n \"decagram-outline\",\n \"decimal\",\n \"decimal-comma\",\n \"decimal-comma-decrease\",\n \"decimal-comma-increase\",\n \"decimal-decrease\",\n \"decimal-increase\",\n \"delete\",\n \"delete-alert\",\n \"delete-alert-outline\",\n \"delete-circle\",\n \"delete-circle-outline\",\n \"delete-clock\",\n \"delete-clock-outline\",\n \"delete-empty\",\n \"delete-empty-outline\",\n \"delete-forever\",\n \"delete-forever-outline\",\n \"delete-off\",\n \"delete-off-outline\",\n \"delete-outline\",\n \"delete-restore\",\n \"delete-sweep\",\n \"delete-sweep-outline\",\n \"delete-variant\",\n \"delta\",\n \"desk\",\n \"desk-lamp\",\n \"desk-lamp-off\",\n \"desk-lamp-on\",\n \"deskphone\",\n \"desktop-classic\",\n \"desktop-tower\",\n \"desktop-tower-monitor\",\n \"details\",\n \"dev-to\",\n \"developer-board\",\n \"deviantart\",\n \"devices\",\n \"dharmachakra\",\n \"diabetes\",\n \"dialpad\",\n \"diameter\",\n \"diameter-outline\",\n \"diameter-variant\",\n \"diamond\",\n \"diamond-outline\",\n \"diamond-stone\",\n \"diaper-outline\",\n \"dice-1\",\n \"dice-1-outline\",\n \"dice-2\",\n \"dice-2-outline\",\n \"dice-3\",\n \"dice-3-outline\",\n \"dice-4\",\n \"dice-4-outline\",\n \"dice-5\",\n \"dice-5-outline\",\n \"dice-6\",\n \"dice-6-outline\",\n \"dice-d10\",\n \"dice-d10-outline\",\n \"dice-d12\",\n \"dice-d12-outline\",\n \"dice-d20\",\n \"dice-d20-outline\",\n \"dice-d4\",\n \"dice-d4-outline\",\n \"dice-d6\",\n \"dice-d6-outline\",\n \"dice-d8\",\n \"dice-d8-outline\",\n \"dice-multiple\",\n \"dice-multiple-outline\",\n \"digital-ocean\",\n \"dip-switch\",\n \"directions\",\n \"directions-fork\",\n \"disc\",\n \"disc-alert\",\n \"disc-player\",\n \"dishwasher\",\n \"dishwasher-alert\",\n \"dishwasher-off\",\n \"disqus\",\n \"distribute-horizontal-center\",\n \"distribute-horizontal-left\",\n \"distribute-horizontal-right\",\n \"distribute-vertical-bottom\",\n \"distribute-vertical-center\",\n \"distribute-vertical-top\",\n \"diversify\",\n \"diving\",\n \"diving-flippers\",\n \"diving-helmet\",\n \"diving-scuba\",\n \"diving-scuba-flag\",\n \"diving-scuba-mask\",\n \"diving-scuba-tank\",\n \"diving-scuba-tank-multiple\",\n \"diving-snorkel\",\n \"division\",\n \"division-box\",\n \"dlna\",\n \"dna\",\n \"dns\",\n \"dns-outline\",\n \"dock-bottom\",\n \"dock-left\",\n \"dock-right\",\n \"dock-top\",\n \"dock-window\",\n \"docker\",\n \"doctor\",\n \"dog\",\n \"dog-service\",\n \"dog-side\",\n \"dog-side-off\",\n \"dolby\",\n \"dolly\",\n \"dolphin\",\n \"domain\",\n \"domain-off\",\n \"domain-plus\",\n \"domain-remove\",\n \"domain-switch\",\n \"dome-light\",\n \"domino-mask\",\n \"donkey\",\n \"door\",\n \"door-closed\",\n \"door-closed-cancel\",\n \"door-closed-lock\",\n \"door-open\",\n \"door-sliding\",\n \"door-sliding-lock\",\n \"door-sliding-open\",\n \"doorbell\",\n \"doorbell-video\",\n \"dot-net\",\n \"dots-circle\",\n \"dots-grid\",\n \"dots-hexagon\",\n \"dots-horizontal\",\n \"dots-horizontal-circle\",\n \"dots-horizontal-circle-outline\",\n \"dots-square\",\n \"dots-triangle\",\n \"dots-vertical\",\n \"dots-vertical-circle\",\n \"dots-vertical-circle-outline\",\n \"download\",\n \"download-box\",\n \"download-box-outline\",\n \"download-circle\",\n \"download-circle-outline\",\n \"download-lock\",\n \"download-lock-outline\",\n \"download-multiple\",\n \"download-multiple-outline\",\n \"download-network\",\n \"download-network-outline\",\n \"download-off\",\n \"download-off-outline\",\n \"download-outline\",\n \"drag\",\n \"drag-horizontal\",\n \"drag-horizontal-variant\",\n \"drag-variant\",\n \"drag-vertical\",\n \"drag-vertical-variant\",\n \"drama-masks\",\n \"draw\",\n \"draw-pen\",\n \"drawing\",\n \"drawing-box\",\n \"dresser\",\n \"dresser-outline\",\n \"drone\",\n \"dropbox\",\n \"drupal\",\n \"duck\",\n \"dumbbell\",\n \"dump-truck\",\n \"ear-hearing\",\n \"ear-hearing-loop\",\n \"ear-hearing-off\",\n \"earbuds\",\n \"earbuds-off\",\n \"earbuds-off-outline\",\n \"earbuds-outline\",\n \"earth\",\n \"earth-arrow-down\",\n \"earth-arrow-left\",\n \"earth-arrow-right\",\n \"earth-arrow-up\",\n \"earth-box\",\n \"earth-box-minus\",\n \"earth-box-off\",\n \"earth-box-plus\",\n \"earth-box-remove\",\n \"earth-minus\",\n \"earth-off\",\n \"earth-plus\",\n \"earth-remove\",\n \"egg\",\n \"egg-easter\",\n \"egg-fried\",\n \"egg-off\",\n \"egg-off-outline\",\n \"egg-outline\",\n \"eiffel-tower\",\n \"eight-track\",\n \"eject\",\n \"eject-circle\",\n \"eject-circle-outline\",\n \"eject-outline\",\n \"electric-switch\",\n \"electric-switch-closed\",\n \"electron-framework\",\n \"elephant\",\n \"elevation-decline\",\n \"elevation-rise\",\n \"elevator\",\n \"elevator-down\",\n \"elevator-passenger\",\n \"elevator-passenger-off\",\n \"elevator-passenger-off-outline\",\n \"elevator-passenger-outline\",\n \"elevator-up\",\n \"ellipse\",\n \"ellipse-outline\",\n \"email\",\n \"email-alert\",\n \"email-alert-outline\",\n \"email-arrow-left\",\n \"email-arrow-left-outline\",\n \"email-arrow-right\",\n \"email-arrow-right-outline\",\n \"email-box\",\n \"email-check\",\n \"email-check-outline\",\n \"email-edit\",\n \"email-edit-outline\",\n \"email-fast\",\n \"email-fast-outline\",\n \"email-heart-outline\",\n \"email-lock\",\n \"email-lock-outline\",\n \"email-mark-as-unread\",\n \"email-minus\",\n \"email-minus-outline\",\n \"email-multiple\",\n \"email-multiple-outline\",\n \"email-newsletter\",\n \"email-off\",\n \"email-off-outline\",\n \"email-open\",\n \"email-open-heart-outline\",\n \"email-open-multiple\",\n \"email-open-multiple-outline\",\n \"email-open-outline\",\n \"email-outline\",\n \"email-plus\",\n \"email-plus-outline\",\n \"email-remove\",\n \"email-remove-outline\",\n \"email-seal\",\n \"email-seal-outline\",\n \"email-search\",\n \"email-search-outline\",\n \"email-sync\",\n \"email-sync-outline\",\n \"email-variant\",\n \"ember\",\n \"emby\",\n \"emoticon\",\n \"emoticon-angry\",\n \"emoticon-angry-outline\",\n \"emoticon-confused\",\n \"emoticon-confused-outline\",\n \"emoticon-cool\",\n \"emoticon-cool-outline\",\n \"emoticon-cry\",\n \"emoticon-cry-outline\",\n \"emoticon-dead\",\n \"emoticon-dead-outline\",\n \"emoticon-devil\",\n \"emoticon-devil-outline\",\n \"emoticon-excited\",\n \"emoticon-excited-outline\",\n \"emoticon-frown\",\n \"emoticon-frown-outline\",\n \"emoticon-happy\",\n \"emoticon-happy-outline\",\n \"emoticon-kiss\",\n \"emoticon-kiss-outline\",\n \"emoticon-lol\",\n \"emoticon-lol-outline\",\n \"emoticon-minus\",\n \"emoticon-minus-outline\",\n \"emoticon-neutral\",\n \"emoticon-neutral-outline\",\n \"emoticon-outline\",\n \"emoticon-plus\",\n \"emoticon-plus-outline\",\n \"emoticon-poop\",\n \"emoticon-poop-outline\",\n \"emoticon-remove\",\n \"emoticon-remove-outline\",\n \"emoticon-sad\",\n \"emoticon-sad-outline\",\n \"emoticon-sick\",\n \"emoticon-sick-outline\",\n \"emoticon-tongue\",\n \"emoticon-tongue-outline\",\n \"emoticon-wink\",\n \"emoticon-wink-outline\",\n \"engine\",\n \"engine-off\",\n \"engine-off-outline\",\n \"engine-outline\",\n \"epsilon\",\n \"equal\",\n \"equal-box\",\n \"equalizer\",\n \"equalizer-outline\",\n \"eraser\",\n \"eraser-variant\",\n \"escalator\",\n \"escalator-box\",\n \"escalator-down\",\n \"escalator-up\",\n \"eslint\",\n \"et\",\n \"ethereum\",\n \"ethernet\",\n \"ethernet-cable\",\n \"ethernet-cable-off\",\n \"ethernet-off\",\n \"ev-plug-ccs1\",\n \"ev-plug-ccs2\",\n \"ev-plug-chademo\",\n \"ev-plug-tesla\",\n \"ev-plug-type1\",\n \"ev-plug-type2\",\n \"ev-station\",\n \"evernote\",\n \"excavator\",\n \"exclamation\",\n \"exclamation-thick\",\n \"exit-run\",\n \"exit-to-app\",\n \"expand-all\",\n \"expand-all-outline\",\n \"expansion-card\",\n \"expansion-card-variant\",\n \"exponent\",\n \"exponent-box\",\n \"export\",\n \"export-variant\",\n \"eye\",\n \"eye-arrow-left\",\n \"eye-arrow-left-outline\",\n \"eye-arrow-right\",\n \"eye-arrow-right-outline\",\n \"eye-check\",\n \"eye-check-outline\",\n \"eye-circle\",\n \"eye-circle-outline\",\n \"eye-closed\",\n \"eye-lock\",\n \"eye-lock-open\",\n \"eye-lock-open-outline\",\n \"eye-lock-outline\",\n \"eye-minus\",\n \"eye-minus-outline\",\n \"eye-off\",\n \"eye-off-outline\",\n \"eye-outline\",\n \"eye-plus\",\n \"eye-plus-outline\",\n \"eye-refresh\",\n \"eye-refresh-outline\",\n \"eye-remove\",\n \"eye-remove-outline\",\n \"eye-settings\",\n \"eye-settings-outline\",\n \"eyedropper\",\n \"eyedropper-minus\",\n \"eyedropper-off\",\n \"eyedropper-plus\",\n \"eyedropper-remove\",\n \"eyedropper-variant\",\n \"face-agent\",\n \"face-man\",\n \"face-man-outline\",\n \"face-man-profile\",\n \"face-man-shimmer\",\n \"face-man-shimmer-outline\",\n \"face-mask\",\n \"face-mask-outline\",\n \"face-recognition\",\n \"face-woman\",\n \"face-woman-outline\",\n \"face-woman-profile\",\n \"face-woman-shimmer\",\n \"face-woman-shimmer-outline\",\n \"facebook\",\n \"facebook-gaming\",\n \"facebook-messenger\",\n \"facebook-workplace\",\n \"factory\",\n \"family-tree\",\n \"fan\",\n \"fan-alert\",\n \"fan-auto\",\n \"fan-chevron-down\",\n \"fan-chevron-up\",\n \"fan-clock\",\n \"fan-minus\",\n \"fan-off\",\n \"fan-plus\",\n \"fan-remove\",\n \"fan-speed-1\",\n \"fan-speed-2\",\n \"fan-speed-3\",\n \"fast-forward\",\n \"fast-forward-10\",\n \"fast-forward-15\",\n \"fast-forward-30\",\n \"fast-forward-45\",\n \"fast-forward-5\",\n \"fast-forward-60\",\n \"fast-forward-outline\",\n \"faucet\",\n \"faucet-variant\",\n \"fax\",\n \"feather\",\n \"feature-search\",\n \"feature-search-outline\",\n \"fedora\",\n \"fence\",\n \"fence-electric\",\n \"fencing\",\n \"ferris-wheel\",\n \"ferry\",\n \"file\",\n \"file-account\",\n \"file-account-outline\",\n \"file-alert\",\n \"file-alert-outline\",\n \"file-arrow-left-right\",\n \"file-arrow-left-right-outline\",\n \"file-arrow-up-down\",\n \"file-arrow-up-down-outline\",\n \"file-cabinet\",\n \"file-cad\",\n \"file-cad-box\",\n \"file-cancel\",\n \"file-cancel-outline\",\n \"file-certificate\",\n \"file-certificate-outline\",\n \"file-chart\",\n \"file-chart-check\",\n \"file-chart-check-outline\",\n \"file-chart-outline\",\n \"file-check\",\n \"file-check-outline\",\n \"file-clock\",\n \"file-clock-outline\",\n \"file-cloud\",\n \"file-cloud-outline\",\n \"file-code\",\n \"file-code-outline\",\n \"file-cog\",\n \"file-cog-outline\",\n \"file-compare\",\n \"file-delimited\",\n \"file-delimited-outline\",\n \"file-document\",\n \"file-document-alert\",\n \"file-document-alert-outline\",\n \"file-document-arrow-right\",\n \"file-document-arrow-right-outline\",\n \"file-document-check\",\n \"file-document-check-outline\",\n \"file-document-edit\",\n \"file-document-edit-outline\",\n \"file-document-minus\",\n \"file-document-minus-outline\",\n \"file-document-multiple\",\n \"file-document-multiple-outline\",\n \"file-document-outline\",\n \"file-document-plus\",\n \"file-document-plus-outline\",\n \"file-document-refresh\",\n \"file-document-refresh-outline\",\n \"file-document-remove\",\n \"file-document-remove-outline\",\n \"file-download\",\n \"file-download-outline\",\n \"file-edit\",\n \"file-edit-outline\",\n \"file-excel\",\n \"file-excel-box\",\n \"file-excel-box-outline\",\n \"file-excel-outline\",\n \"file-export\",\n \"file-export-outline\",\n \"file-eye\",\n \"file-eye-outline\",\n \"file-find\",\n \"file-find-outline\",\n \"file-gif-box\",\n \"file-hidden\",\n \"file-image\",\n \"file-image-marker\",\n \"file-image-marker-outline\",\n \"file-image-minus\",\n \"file-image-minus-outline\",\n \"file-image-outline\",\n \"file-image-plus\",\n \"file-image-plus-outline\",\n \"file-image-remove\",\n \"file-image-remove-outline\",\n \"file-import\",\n \"file-import-outline\",\n \"file-jpg-box\",\n \"file-key\",\n \"file-key-outline\",\n \"file-link\",\n \"file-link-outline\",\n \"file-lock\",\n \"file-lock-open\",\n \"file-lock-open-outline\",\n \"file-lock-outline\",\n \"file-marker\",\n \"file-marker-outline\",\n \"file-minus\",\n \"file-minus-outline\",\n \"file-move\",\n \"file-move-outline\",\n \"file-multiple\",\n \"file-multiple-outline\",\n \"file-music\",\n \"file-music-outline\",\n \"file-outline\",\n \"file-pdf-box\",\n \"file-percent\",\n \"file-percent-outline\",\n \"file-phone\",\n \"file-phone-outline\",\n \"file-plus\",\n \"file-plus-outline\",\n \"file-png-box\",\n \"file-powerpoint\",\n \"file-powerpoint-box\",\n \"file-powerpoint-box-outline\",\n \"file-powerpoint-outline\",\n \"file-presentation-box\",\n \"file-question\",\n \"file-question-outline\",\n \"file-refresh\",\n \"file-refresh-outline\",\n \"file-remove\",\n \"file-remove-outline\",\n \"file-replace\",\n \"file-replace-outline\",\n \"file-restore\",\n \"file-restore-outline\",\n \"file-rotate-left\",\n \"file-rotate-left-outline\",\n \"file-rotate-right\",\n \"file-rotate-right-outline\",\n \"file-search\",\n \"file-search-outline\",\n \"file-send\",\n \"file-send-outline\",\n \"file-settings\",\n \"file-settings-outline\",\n \"file-sign\",\n \"file-star\",\n \"file-star-four-points\",\n \"file-star-four-points-outline\",\n \"file-star-outline\",\n \"file-swap\",\n \"file-swap-outline\",\n \"file-sync\",\n \"file-sync-outline\",\n \"file-table\",\n \"file-table-box\",\n \"file-table-box-multiple\",\n \"file-table-box-multiple-outline\",\n \"file-table-box-outline\",\n \"file-table-outline\",\n \"file-tree\",\n \"file-tree-outline\",\n \"file-undo\",\n \"file-undo-outline\",\n \"file-upload\",\n \"file-upload-outline\",\n \"file-video\",\n \"file-video-outline\",\n \"file-word\",\n \"file-word-box\",\n \"file-word-box-outline\",\n \"file-word-outline\",\n \"file-xml-box\",\n \"film\",\n \"filmstrip\",\n \"filmstrip-box\",\n \"filmstrip-box-multiple\",\n \"filmstrip-off\",\n \"filter\",\n \"filter-check\",\n \"filter-check-outline\",\n \"filter-cog\",\n \"filter-cog-outline\",\n \"filter-menu\",\n \"filter-menu-outline\",\n \"filter-minus\",\n \"filter-minus-outline\",\n \"filter-multiple\",\n \"filter-multiple-outline\",\n \"filter-off\",\n \"filter-off-outline\",\n \"filter-outline\",\n \"filter-plus\",\n \"filter-plus-outline\",\n \"filter-remove\",\n \"filter-remove-outline\",\n \"filter-settings\",\n \"filter-settings-outline\",\n \"filter-variant\",\n \"filter-variant-minus\",\n \"filter-variant-plus\",\n \"filter-variant-remove\",\n \"finance\",\n \"find-replace\",\n \"fingerprint\",\n \"fingerprint-off\",\n \"fire\",\n \"fire-alert\",\n \"fire-circle\",\n \"fire-extinguisher\",\n \"fire-hydrant\",\n \"fire-hydrant-alert\",\n \"fire-hydrant-off\",\n \"fire-off\",\n \"fire-station\",\n \"fire-truck\",\n \"firebase\",\n \"firefox\",\n \"fireplace\",\n \"fireplace-off\",\n \"firewire\",\n \"firework\",\n \"firework-off\",\n \"fish\",\n \"fish-off\",\n \"fishbowl\",\n \"fishbowl-outline\",\n \"fit-to-page\",\n \"fit-to-page-outline\",\n \"fit-to-screen\",\n \"fit-to-screen-outline\",\n \"flag\",\n \"flag-checkered\",\n \"flag-minus\",\n \"flag-minus-outline\",\n \"flag-off\",\n \"flag-off-outline\",\n \"flag-outline\",\n \"flag-plus\",\n \"flag-plus-outline\",\n \"flag-remove\",\n \"flag-remove-outline\",\n \"flag-triangle\",\n \"flag-variant\",\n \"flag-variant-minus\",\n \"flag-variant-minus-outline\",\n \"flag-variant-off\",\n \"flag-variant-off-outline\",\n \"flag-variant-outline\",\n \"flag-variant-plus\",\n \"flag-variant-plus-outline\",\n \"flag-variant-remove\",\n \"flag-variant-remove-outline\",\n \"flare\",\n \"flash\",\n \"flash-alert\",\n \"flash-alert-outline\",\n \"flash-auto\",\n \"flash-off\",\n \"flash-off-outline\",\n \"flash-outline\",\n \"flash-red-eye\",\n \"flash-triangle\",\n \"flash-triangle-outline\",\n \"flashlight\",\n \"flashlight-off\",\n \"flask\",\n \"flask-empty\",\n \"flask-empty-minus\",\n \"flask-empty-minus-outline\",\n \"flask-empty-off\",\n \"flask-empty-off-outline\",\n \"flask-empty-outline\",\n \"flask-empty-plus\",\n \"flask-empty-plus-outline\",\n \"flask-empty-remove\",\n \"flask-empty-remove-outline\",\n \"flask-minus\",\n \"flask-minus-outline\",\n \"flask-off\",\n \"flask-off-outline\",\n \"flask-outline\",\n \"flask-plus\",\n \"flask-plus-outline\",\n \"flask-remove\",\n \"flask-remove-outline\",\n \"flask-round-bottom\",\n \"flask-round-bottom-empty\",\n \"flask-round-bottom-empty-outline\",\n \"flask-round-bottom-outline\",\n \"fleur-de-lis\",\n \"flip-horizontal\",\n \"flip-to-back\",\n \"flip-to-front\",\n \"flip-vertical\",\n \"floor-lamp\",\n \"floor-lamp-dual\",\n \"floor-lamp-dual-outline\",\n \"floor-lamp-outline\",\n \"floor-lamp-torchiere\",\n \"floor-lamp-torchiere-outline\",\n \"floor-lamp-torchiere-variant\",\n \"floor-lamp-torchiere-variant-outline\",\n \"floor-plan\",\n \"floppy\",\n \"floppy-variant\",\n \"flower\",\n \"flower-outline\",\n \"flower-pollen\",\n \"flower-pollen-outline\",\n \"flower-poppy\",\n \"flower-tulip\",\n \"flower-tulip-outline\",\n \"focus-auto\",\n \"focus-field\",\n \"focus-field-horizontal\",\n \"focus-field-vertical\",\n \"folder\",\n \"folder-account\",\n \"folder-account-outline\",\n \"folder-alert\",\n \"folder-alert-outline\",\n \"folder-arrow-down\",\n \"folder-arrow-down-outline\",\n \"folder-arrow-left\",\n \"folder-arrow-left-outline\",\n \"folder-arrow-left-right\",\n \"folder-arrow-left-right-outline\",\n \"folder-arrow-right\",\n \"folder-arrow-right-outline\",\n \"folder-arrow-up\",\n \"folder-arrow-up-down\",\n \"folder-arrow-up-down-outline\",\n \"folder-arrow-up-outline\",\n \"folder-cancel\",\n \"folder-cancel-outline\",\n \"folder-check\",\n \"folder-check-outline\",\n \"folder-clock\",\n \"folder-clock-outline\",\n \"folder-cog\",\n \"folder-cog-outline\",\n \"folder-download\",\n \"folder-download-outline\",\n \"folder-edit\",\n \"folder-edit-outline\",\n \"folder-eye\",\n \"folder-eye-outline\",\n \"folder-file\",\n \"folder-file-outline\",\n \"folder-google-drive\",\n \"folder-heart\",\n \"folder-heart-outline\",\n \"folder-hidden\",\n \"folder-home\",\n \"folder-home-outline\",\n \"folder-image\",\n \"folder-information\",\n \"folder-information-outline\",\n \"folder-key\",\n \"folder-key-network\",\n \"folder-key-network-outline\",\n \"folder-key-outline\",\n \"folder-lock\",\n \"folder-lock-open\",\n \"folder-lock-open-outline\",\n \"folder-lock-outline\",\n \"folder-marker\",\n \"folder-marker-outline\",\n \"folder-minus\",\n \"folder-minus-outline\",\n \"folder-move\",\n \"folder-move-outline\",\n \"folder-multiple\",\n \"folder-multiple-image\",\n \"folder-multiple-outline\",\n \"folder-multiple-plus\",\n \"folder-multiple-plus-outline\",\n \"folder-music\",\n \"folder-music-outline\",\n \"folder-network\",\n \"folder-network-outline\",\n \"folder-off\",\n \"folder-off-outline\",\n \"folder-open\",\n \"folder-open-outline\",\n \"folder-outline\",\n \"folder-play\",\n \"folder-play-outline\",\n \"folder-plus\",\n \"folder-plus-outline\",\n \"folder-pound\",\n \"folder-pound-outline\",\n \"folder-question\",\n \"folder-question-outline\",\n \"folder-refresh\",\n \"folder-refresh-outline\",\n \"folder-remove\",\n \"folder-remove-outline\",\n \"folder-search\",\n \"folder-search-outline\",\n \"folder-settings\",\n \"folder-settings-outline\",\n \"folder-star\",\n \"folder-star-multiple\",\n \"folder-star-multiple-outline\",\n \"folder-star-outline\",\n \"folder-swap\",\n \"folder-swap-outline\",\n \"folder-sync\",\n \"folder-sync-outline\",\n \"folder-table\",\n \"folder-table-outline\",\n \"folder-text\",\n \"folder-text-outline\",\n \"folder-upload\",\n \"folder-upload-outline\",\n \"folder-wrench\",\n \"folder-wrench-outline\",\n \"folder-zip\",\n \"folder-zip-outline\",\n \"font-awesome\",\n \"food\",\n \"food-apple\",\n \"food-apple-outline\",\n \"food-croissant\",\n \"food-drumstick\",\n \"food-drumstick-off\",\n \"food-drumstick-off-outline\",\n \"food-drumstick-outline\",\n \"food-fork-drink\",\n \"food-halal\",\n \"food-hot-dog\",\n \"food-kosher\",\n \"food-off\",\n \"food-off-outline\",\n \"food-outline\",\n \"food-steak\",\n \"food-steak-off\",\n \"food-takeout-box\",\n \"food-takeout-box-outline\",\n \"food-turkey\",\n \"food-variant\",\n \"food-variant-off\",\n \"foot-print\",\n \"football\",\n \"football-australian\",\n \"football-helmet\",\n \"forest\",\n \"forest-outline\",\n \"forklift\",\n \"form-dropdown\",\n \"form-select\",\n \"form-textarea\",\n \"form-textbox\",\n \"form-textbox-lock\",\n \"form-textbox-password\",\n \"format-align-bottom\",\n \"format-align-center\",\n \"format-align-justify\",\n \"format-align-left\",\n \"format-align-middle\",\n \"format-align-right\",\n \"format-align-top\",\n \"format-annotation-minus\",\n \"format-annotation-plus\",\n \"format-bold\",\n \"format-clear\",\n \"format-color-fill\",\n \"format-color-highlight\",\n \"format-color-marker-cancel\",\n \"format-color-text\",\n \"format-columns\",\n \"format-float-center\",\n \"format-float-left\",\n \"format-float-none\",\n \"format-float-right\",\n \"format-font\",\n \"format-font-size-decrease\",\n \"format-font-size-increase\",\n \"format-header-1\",\n \"format-header-2\",\n \"format-header-3\",\n \"format-header-4\",\n \"format-header-5\",\n \"format-header-6\",\n \"format-header-decrease\",\n \"format-header-equal\",\n \"format-header-increase\",\n \"format-header-pound\",\n \"format-horizontal-align-center\",\n \"format-horizontal-align-left\",\n \"format-horizontal-align-right\",\n \"format-indent-decrease\",\n \"format-indent-increase\",\n \"format-italic\",\n \"format-letter-case\",\n \"format-letter-case-lower\",\n \"format-letter-case-upper\",\n \"format-letter-ends-with\",\n \"format-letter-matches\",\n \"format-letter-spacing\",\n \"format-letter-spacing-variant\",\n \"format-letter-starts-with\",\n \"format-line-height\",\n \"format-line-spacing\",\n \"format-line-style\",\n \"format-line-weight\",\n \"format-list-bulleted\",\n \"format-list-bulleted-square\",\n \"format-list-bulleted-triangle\",\n \"format-list-bulleted-type\",\n \"format-list-checkbox\",\n \"format-list-checks\",\n \"format-list-group\",\n \"format-list-group-plus\",\n \"format-list-numbered\",\n \"format-list-numbered-rtl\",\n \"format-list-text\",\n \"format-overline\",\n \"format-page-break\",\n \"format-page-split\",\n \"format-paint\",\n \"format-paragraph\",\n \"format-paragraph-spacing\",\n \"format-pilcrow\",\n \"format-pilcrow-arrow-left\",\n \"format-pilcrow-arrow-right\",\n \"format-quote-close\",\n \"format-quote-close-outline\",\n \"format-quote-open\",\n \"format-quote-open-outline\",\n \"format-rotate-90\",\n \"format-section\",\n \"format-size\",\n \"format-strikethrough\",\n \"format-strikethrough-variant\",\n \"format-subscript\",\n \"format-superscript\",\n \"format-text\",\n \"format-text-rotation-angle-down\",\n \"format-text-rotation-angle-up\",\n \"format-text-rotation-down\",\n \"format-text-rotation-down-vertical\",\n \"format-text-rotation-none\",\n \"format-text-rotation-up\",\n \"format-text-rotation-vertical\",\n \"format-text-variant\",\n \"format-text-variant-outline\",\n \"format-text-wrapping-clip\",\n \"format-text-wrapping-overflow\",\n \"format-text-wrapping-wrap\",\n \"format-textbox\",\n \"format-title\",\n \"format-underline\",\n \"format-underline-wavy\",\n \"format-vertical-align-bottom\",\n \"format-vertical-align-center\",\n \"format-vertical-align-top\",\n \"format-wrap-inline\",\n \"format-wrap-square\",\n \"format-wrap-tight\",\n \"format-wrap-top-bottom\",\n \"forum\",\n \"forum-minus\",\n \"forum-minus-outline\",\n \"forum-outline\",\n \"forum-plus\",\n \"forum-plus-outline\",\n \"forum-remove\",\n \"forum-remove-outline\",\n \"forward\",\n \"forwardburger\",\n \"fountain\",\n \"fountain-pen\",\n \"fountain-pen-tip\",\n \"fraction-one-half\",\n \"freebsd\",\n \"french-fries\",\n \"frequently-asked-questions\",\n \"fridge\",\n \"fridge-alert\",\n \"fridge-alert-outline\",\n \"fridge-bottom\",\n \"fridge-industrial\",\n \"fridge-industrial-alert\",\n \"fridge-industrial-alert-outline\",\n \"fridge-industrial-off\",\n \"fridge-industrial-off-outline\",\n \"fridge-industrial-outline\",\n \"fridge-off\",\n \"fridge-off-outline\",\n \"fridge-outline\",\n \"fridge-top\",\n \"fridge-variant\",\n \"fridge-variant-alert\",\n \"fridge-variant-alert-outline\",\n \"fridge-variant-off\",\n \"fridge-variant-off-outline\",\n \"fridge-variant-outline\",\n \"fruit-cherries\",\n \"fruit-cherries-off\",\n \"fruit-citrus\",\n \"fruit-citrus-off\",\n \"fruit-grapes\",\n \"fruit-grapes-outline\",\n \"fruit-pear\",\n \"fruit-pineapple\",\n \"fruit-watermelon\",\n \"fuel\",\n \"fuel-cell\",\n \"fullscreen\",\n \"fullscreen-exit\",\n \"function\",\n \"function-variant\",\n \"furigana-horizontal\",\n \"furigana-vertical\",\n \"fuse\",\n \"fuse-alert\",\n \"fuse-blade\",\n \"fuse-off\",\n \"gamepad\",\n \"gamepad-circle\",\n \"gamepad-circle-down\",\n \"gamepad-circle-left\",\n \"gamepad-circle-outline\",\n \"gamepad-circle-right\",\n \"gamepad-circle-up\",\n \"gamepad-down\",\n \"gamepad-left\",\n \"gamepad-outline\",\n \"gamepad-right\",\n \"gamepad-round\",\n \"gamepad-round-down\",\n \"gamepad-round-left\",\n \"gamepad-round-outline\",\n \"gamepad-round-right\",\n \"gamepad-round-up\",\n \"gamepad-square\",\n \"gamepad-square-outline\",\n \"gamepad-up\",\n \"gamepad-variant\",\n \"gamepad-variant-outline\",\n \"gamma\",\n \"gantry-crane\",\n \"garage\",\n \"garage-alert\",\n \"garage-alert-variant\",\n \"garage-lock\",\n \"garage-open\",\n \"garage-open-variant\",\n \"garage-variant\",\n \"garage-variant-lock\",\n \"gas-burner\",\n \"gas-cylinder\",\n \"gas-station\",\n \"gas-station-in-use\",\n \"gas-station-in-use-outline\",\n \"gas-station-off\",\n \"gas-station-off-outline\",\n \"gas-station-outline\",\n \"gate\",\n \"gate-alert\",\n \"gate-and\",\n \"gate-arrow-left\",\n \"gate-arrow-right\",\n \"gate-buffer\",\n \"gate-nand\",\n \"gate-nor\",\n \"gate-not\",\n \"gate-open\",\n \"gate-or\",\n \"gate-xnor\",\n \"gate-xor\",\n \"gatsby\",\n \"gauge\",\n \"gauge-empty\",\n \"gauge-full\",\n \"gauge-low\",\n \"gavel\",\n \"gender-female\",\n \"gender-male\",\n \"gender-male-female\",\n \"gender-male-female-variant\",\n \"gender-non-binary\",\n \"gender-transgender\",\n \"generator-mobile\",\n \"generator-portable\",\n \"generator-stationary\",\n \"gentoo\",\n \"gesture\",\n \"gesture-double-tap\",\n \"gesture-pinch\",\n \"gesture-spread\",\n \"gesture-swipe\",\n \"gesture-swipe-down\",\n \"gesture-swipe-horizontal\",\n \"gesture-swipe-left\",\n \"gesture-swipe-right\",\n \"gesture-swipe-up\",\n \"gesture-swipe-vertical\",\n \"gesture-tap\",\n \"gesture-tap-box\",\n \"gesture-tap-button\",\n \"gesture-tap-hold\",\n \"gesture-two-double-tap\",\n \"gesture-two-tap\",\n \"ghost\",\n \"ghost-off\",\n \"ghost-off-outline\",\n \"ghost-outline\",\n \"gift\",\n \"gift-off\",\n \"gift-off-outline\",\n \"gift-open\",\n \"gift-open-outline\",\n \"gift-outline\",\n \"git\",\n \"github\",\n \"gitlab\",\n \"glass-cocktail\",\n \"glass-cocktail-off\",\n \"glass-flute\",\n \"glass-fragile\",\n \"glass-mug\",\n \"glass-mug-off\",\n \"glass-mug-variant\",\n \"glass-mug-variant-off\",\n \"glass-pint-outline\",\n \"glass-stange\",\n \"glass-tulip\",\n \"glass-wine\",\n \"glasses\",\n \"globe-light\",\n \"globe-light-outline\",\n \"globe-model\",\n \"gmail\",\n \"gnome\",\n \"go-kart\",\n \"go-kart-track\",\n \"gog\",\n \"gold\",\n \"golf\",\n \"golf-cart\",\n \"golf-tee\",\n \"gondola\",\n \"goodreads\",\n \"google\",\n \"google-ads\",\n \"google-analytics\",\n \"google-assistant\",\n \"google-cardboard\",\n \"google-chrome\",\n \"google-circles\",\n \"google-circles-communities\",\n \"google-circles-extended\",\n \"google-circles-group\",\n \"google-classroom\",\n \"google-cloud\",\n \"google-downasaur\",\n \"google-drive\",\n \"google-earth\",\n \"google-fit\",\n \"google-glass\",\n \"google-hangouts\",\n \"google-keep\",\n \"google-lens\",\n \"google-maps\",\n \"google-my-business\",\n \"google-nearby\",\n \"google-play\",\n \"google-plus\",\n \"google-podcast\",\n \"google-spreadsheet\",\n \"google-street-view\",\n \"google-translate\",\n \"gradient-horizontal\",\n \"gradient-vertical\",\n \"grain\",\n \"graph\",\n \"graph-outline\",\n \"graphql\",\n \"grass\",\n \"grave-stone\",\n \"grease-pencil\",\n \"greater-than\",\n \"greater-than-or-equal\",\n \"greenhouse\",\n \"grid\",\n \"grid-large\",\n \"grid-off\",\n \"grill\",\n \"grill-outline\",\n \"group\",\n \"guitar-acoustic\",\n \"guitar-electric\",\n \"guitar-pick\",\n \"guitar-pick-outline\",\n \"guy-fawkes-mask\",\n \"gymnastics\",\n \"hail\",\n \"hair-dryer\",\n \"hair-dryer-outline\",\n \"halloween\",\n \"hamburger\",\n \"hamburger-check\",\n \"hamburger-minus\",\n \"hamburger-off\",\n \"hamburger-plus\",\n \"hamburger-remove\",\n \"hammer\",\n \"hammer-screwdriver\",\n \"hammer-sickle\",\n \"hammer-wrench\",\n \"hand-back-left\",\n \"hand-back-left-off\",\n \"hand-back-left-off-outline\",\n \"hand-back-left-outline\",\n \"hand-back-right\",\n \"hand-back-right-off\",\n \"hand-back-right-off-outline\",\n \"hand-back-right-outline\",\n \"hand-clap\",\n \"hand-clap-off\",\n \"hand-coin\",\n \"hand-coin-outline\",\n \"hand-cycle\",\n \"hand-extended\",\n \"hand-extended-outline\",\n \"hand-front-left\",\n \"hand-front-left-outline\",\n \"hand-front-right\",\n \"hand-front-right-outline\",\n \"hand-heart\",\n \"hand-heart-outline\",\n \"hand-okay\",\n \"hand-peace\",\n \"hand-peace-variant\",\n \"hand-pointing-down\",\n \"hand-pointing-left\",\n \"hand-pointing-right\",\n \"hand-pointing-up\",\n \"hand-saw\",\n \"hand-wash\",\n \"hand-wash-outline\",\n \"hand-water\",\n \"hand-wave\",\n \"hand-wave-outline\",\n \"handball\",\n \"handcuffs\",\n \"hands-pray\",\n \"handshake\",\n \"handshake-outline\",\n \"hanger\",\n \"hard-hat\",\n \"harddisk\",\n \"harddisk-plus\",\n \"harddisk-remove\",\n \"hat-fedora\",\n \"hazard-lights\",\n \"hdmi-port\",\n \"hdr\",\n \"hdr-off\",\n \"head\",\n \"head-alert\",\n \"head-alert-outline\",\n \"head-check\",\n \"head-check-outline\",\n \"head-cog\",\n \"head-cog-outline\",\n \"head-dots-horizontal\",\n \"head-dots-horizontal-outline\",\n \"head-flash\",\n \"head-flash-outline\",\n \"head-heart\",\n \"head-heart-outline\",\n \"head-lightbulb\",\n \"head-lightbulb-outline\",\n \"head-minus\",\n \"head-minus-outline\",\n \"head-outline\",\n \"head-plus\",\n \"head-plus-outline\",\n \"head-question\",\n \"head-question-outline\",\n \"head-remove\",\n \"head-remove-outline\",\n \"head-snowflake\",\n \"head-snowflake-outline\",\n \"head-sync\",\n \"head-sync-outline\",\n \"headphones\",\n \"headphones-bluetooth\",\n \"headphones-box\",\n \"headphones-off\",\n \"headphones-settings\",\n \"headset\",\n \"headset-dock\",\n \"headset-off\",\n \"heart\",\n \"heart-box\",\n \"heart-box-outline\",\n \"heart-broken\",\n \"heart-broken-outline\",\n \"heart-circle\",\n \"heart-circle-outline\",\n \"heart-cog\",\n \"heart-cog-outline\",\n \"heart-flash\",\n \"heart-half\",\n \"heart-half-full\",\n \"heart-half-outline\",\n \"heart-minus\",\n \"heart-minus-outline\",\n \"heart-multiple\",\n \"heart-multiple-outline\",\n \"heart-off\",\n \"heart-off-outline\",\n \"heart-outline\",\n \"heart-plus\",\n \"heart-plus-outline\",\n \"heart-pulse\",\n \"heart-remove\",\n \"heart-remove-outline\",\n \"heart-search\",\n \"heart-settings\",\n \"heart-settings-outline\",\n \"heat-pump\",\n \"heat-pump-outline\",\n \"heat-wave\",\n \"heating-coil\",\n \"helicopter\",\n \"help\",\n \"help-box\",\n \"help-box-multiple\",\n \"help-box-multiple-outline\",\n \"help-box-outline\",\n \"help-circle\",\n \"help-circle-outline\",\n \"help-network\",\n \"help-network-outline\",\n \"help-rhombus\",\n \"help-rhombus-outline\",\n \"hexadecimal\",\n \"hexagon\",\n \"hexagon-multiple\",\n \"hexagon-multiple-outline\",\n \"hexagon-outline\",\n \"hexagon-slice-1\",\n \"hexagon-slice-2\",\n \"hexagon-slice-3\",\n \"hexagon-slice-4\",\n \"hexagon-slice-5\",\n \"hexagon-slice-6\",\n \"hexagram\",\n \"hexagram-outline\",\n \"high-definition\",\n \"high-definition-box\",\n \"highway\",\n \"hiking\",\n \"history\",\n \"hockey-puck\",\n \"hockey-sticks\",\n \"hololens\",\n \"home\",\n \"home-account\",\n \"home-alert\",\n \"home-alert-outline\",\n \"home-analytics\",\n \"home-assistant\",\n \"home-automation\",\n \"home-battery\",\n \"home-battery-outline\",\n \"home-circle\",\n \"home-circle-outline\",\n \"home-city\",\n \"home-city-outline\",\n \"home-clock\",\n \"home-clock-outline\",\n \"home-edit\",\n \"home-edit-outline\",\n \"home-export-outline\",\n \"home-flood\",\n \"home-floor-0\",\n \"home-floor-1\",\n \"home-floor-2\",\n \"home-floor-3\",\n \"home-floor-a\",\n \"home-floor-b\",\n \"home-floor-g\",\n \"home-floor-l\",\n \"home-floor-negative-1\",\n \"home-group\",\n \"home-group-minus\",\n \"home-group-plus\",\n \"home-group-remove\",\n \"home-heart\",\n \"home-import-outline\",\n \"home-lightbulb\",\n \"home-lightbulb-outline\",\n \"home-lightning-bolt\",\n \"home-lightning-bolt-outline\",\n \"home-lock\",\n \"home-lock-open\",\n \"home-map-marker\",\n \"home-minus\",\n \"home-minus-outline\",\n \"home-modern\",\n \"home-off\",\n \"home-off-outline\",\n \"home-outline\",\n \"home-percent\",\n \"home-percent-outline\",\n \"home-plus\",\n \"home-plus-outline\",\n \"home-remove\",\n \"home-remove-outline\",\n \"home-roof\",\n \"home-search\",\n \"home-search-outline\",\n \"home-silo\",\n \"home-silo-outline\",\n \"home-sound-in\",\n \"home-sound-in-outline\",\n \"home-sound-out\",\n \"home-sound-out-outline\",\n \"home-switch\",\n \"home-switch-outline\",\n \"home-thermometer\",\n \"home-thermometer-outline\",\n \"home-variant\",\n \"home-variant-outline\",\n \"hook\",\n \"hook-off\",\n \"hoop-house\",\n \"hops\",\n \"horizontal-rotate-clockwise\",\n \"horizontal-rotate-counterclockwise\",\n \"horse\",\n \"horse-human\",\n \"horse-variant\",\n \"horse-variant-fast\",\n \"horseshoe\",\n \"hospital\",\n \"hospital-box\",\n \"hospital-box-outline\",\n \"hospital-building\",\n \"hospital-marker\",\n \"hot-tub\",\n \"hours-12\",\n \"hours-24\",\n \"hub\",\n \"hub-outline\",\n \"hubspot\",\n \"hulu\",\n \"human\",\n \"human-baby-changing-table\",\n \"human-cane\",\n \"human-capacity-decrease\",\n \"human-capacity-increase\",\n \"human-child\",\n \"human-dolly\",\n \"human-edit\",\n \"human-female\",\n \"human-female-boy\",\n \"human-female-dance\",\n \"human-female-female\",\n \"human-female-female-child\",\n \"human-female-girl\",\n \"human-greeting\",\n \"human-greeting-proximity\",\n \"human-greeting-variant\",\n \"human-handsdown\",\n \"human-handsup\",\n \"human-male\",\n \"human-male-board\",\n \"human-male-board-poll\",\n \"human-male-boy\",\n \"human-male-child\",\n \"human-male-female\",\n \"human-male-female-child\",\n \"human-male-girl\",\n \"human-male-height\",\n \"human-male-height-variant\",\n \"human-male-male\",\n \"human-male-male-child\",\n \"human-non-binary\",\n \"human-pregnant\",\n \"human-queue\",\n \"human-scooter\",\n \"human-walker\",\n \"human-wheelchair\",\n \"human-white-cane\",\n \"humble-bundle\",\n \"hvac\",\n \"hvac-off\",\n \"hydraulic-oil-level\",\n \"hydraulic-oil-temperature\",\n \"hydro-power\",\n \"hydrogen-station\",\n \"ice-cream\",\n \"ice-cream-off\",\n \"ice-pop\",\n \"id-card\",\n \"identifier\",\n \"ideogram-cjk\",\n \"ideogram-cjk-variant\",\n \"image\",\n \"image-album\",\n \"image-area\",\n \"image-area-close\",\n \"image-auto-adjust\",\n \"image-broken\",\n \"image-broken-variant\",\n \"image-check\",\n \"image-check-outline\",\n \"image-edit\",\n \"image-edit-outline\",\n \"image-filter-black-white\",\n \"image-filter-center-focus\",\n \"image-filter-center-focus-strong\",\n \"image-filter-center-focus-strong-outline\",\n \"image-filter-center-focus-weak\",\n \"image-filter-drama\",\n \"image-filter-drama-outline\",\n \"image-filter-frames\",\n \"image-filter-hdr\",\n \"image-filter-hdr-outline\",\n \"image-filter-none\",\n \"image-filter-tilt-shift\",\n \"image-filter-vintage\",\n \"image-frame\",\n \"image-lock\",\n \"image-lock-outline\",\n \"image-marker\",\n \"image-marker-outline\",\n \"image-minus\",\n \"image-minus-outline\",\n \"image-move\",\n \"image-multiple\",\n \"image-multiple-outline\",\n \"image-off\",\n \"image-off-outline\",\n \"image-outline\",\n \"image-plus\",\n \"image-plus-outline\",\n \"image-refresh\",\n \"image-refresh-outline\",\n \"image-remove\",\n \"image-remove-outline\",\n \"image-search\",\n \"image-search-outline\",\n \"image-size-select-actual\",\n \"image-size-select-large\",\n \"image-size-select-small\",\n \"image-sync\",\n \"image-sync-outline\",\n \"image-text\",\n \"import\",\n \"inbox\",\n \"inbox-arrow-down\",\n \"inbox-arrow-down-outline\",\n \"inbox-arrow-up\",\n \"inbox-arrow-up-outline\",\n \"inbox-full\",\n \"inbox-full-outline\",\n \"inbox-multiple\",\n \"inbox-multiple-outline\",\n \"inbox-outline\",\n \"inbox-remove\",\n \"inbox-remove-outline\",\n \"incognito\",\n \"incognito-circle\",\n \"incognito-circle-off\",\n \"incognito-off\",\n \"induction\",\n \"infinity\",\n \"information\",\n \"information-box\",\n \"information-box-outline\",\n \"information-off\",\n \"information-off-outline\",\n \"information-outline\",\n \"information-slab-box\",\n \"information-slab-box-outline\",\n \"information-slab-circle\",\n \"information-slab-circle-outline\",\n \"information-slab-symbol\",\n \"information-symbol\",\n \"information-variant\",\n \"information-variant-box\",\n \"information-variant-box-outline\",\n \"information-variant-circle\",\n \"information-variant-circle-outline\",\n \"instagram\",\n \"instrument-triangle\",\n \"integrated-circuit-chip\",\n \"invert-colors\",\n \"invert-colors-off\",\n \"invoice\",\n \"invoice-arrow-left\",\n \"invoice-arrow-left-outline\",\n \"invoice-arrow-right\",\n \"invoice-arrow-right-outline\",\n \"invoice-check\",\n \"invoice-check-outline\",\n \"invoice-clock\",\n \"invoice-clock-outline\",\n \"invoice-edit\",\n \"invoice-edit-outline\",\n \"invoice-export-outline\",\n \"invoice-fast\",\n \"invoice-fast-outline\",\n \"invoice-import\",\n \"invoice-import-outline\",\n \"invoice-list\",\n \"invoice-list-outline\",\n \"invoice-minus\",\n \"invoice-minus-outline\",\n \"invoice-multiple\",\n \"invoice-multiple-outline\",\n \"invoice-outline\",\n \"invoice-plus\",\n \"invoice-plus-outline\",\n \"invoice-remove\",\n \"invoice-remove-outline\",\n \"invoice-send\",\n \"invoice-send-outline\",\n \"invoice-text\",\n \"invoice-text-arrow-left\",\n \"invoice-text-arrow-left-outline\",\n \"invoice-text-arrow-right\",\n \"invoice-text-arrow-right-outline\",\n \"invoice-text-check\",\n \"invoice-text-check-outline\",\n \"invoice-text-clock\",\n \"invoice-text-clock-outline\",\n \"invoice-text-edit\",\n \"invoice-text-edit-outline\",\n \"invoice-text-fast\",\n \"invoice-text-fast-outline\",\n \"invoice-text-minus\",\n \"invoice-text-minus-outline\",\n \"invoice-text-multiple\",\n \"invoice-text-multiple-outline\",\n \"invoice-text-outline\",\n \"invoice-text-plus\",\n \"invoice-text-plus-outline\",\n \"invoice-text-remove\",\n \"invoice-text-remove-outline\",\n \"invoice-text-send\",\n \"invoice-text-send-outline\",\n \"iobroker\",\n \"ip\",\n \"ip-network\",\n \"ip-network-outline\",\n \"ip-outline\",\n \"ipod\",\n \"iron\",\n \"iron-board\",\n \"iron-outline\",\n \"island\",\n \"island-variant\",\n \"iv-bag\",\n \"jabber\",\n \"jeepney\",\n \"jellyfish\",\n \"jellyfish-outline\",\n \"jira\",\n \"jquery\",\n \"jsfiddle\",\n \"jump-rope\",\n \"kabaddi\",\n \"kangaroo\",\n \"karate\",\n \"kayaking\",\n \"keg\",\n \"kettle\",\n \"kettle-alert\",\n \"kettle-alert-outline\",\n \"kettle-off\",\n \"kettle-off-outline\",\n \"kettle-outline\",\n \"kettle-pour-over\",\n \"kettle-steam\",\n \"kettle-steam-outline\",\n \"kettlebell\",\n \"key\",\n \"key-alert\",\n \"key-alert-outline\",\n \"key-arrow-right\",\n \"key-chain\",\n \"key-chain-variant\",\n \"key-change\",\n \"key-link\",\n \"key-minus\",\n \"key-outline\",\n \"key-plus\",\n \"key-remove\",\n \"key-star\",\n \"key-variant\",\n \"key-wireless\",\n \"keyboard\",\n \"keyboard-backspace\",\n \"keyboard-caps\",\n \"keyboard-close\",\n \"keyboard-close-outline\",\n \"keyboard-esc\",\n \"keyboard-f1\",\n \"keyboard-f10\",\n \"keyboard-f11\",\n \"keyboard-f12\",\n \"keyboard-f2\",\n \"keyboard-f3\",\n \"keyboard-f4\",\n \"keyboard-f5\",\n \"keyboard-f6\",\n \"keyboard-f7\",\n \"keyboard-f8\",\n \"keyboard-f9\",\n \"keyboard-off\",\n \"keyboard-off-outline\",\n \"keyboard-outline\",\n \"keyboard-return\",\n \"keyboard-settings\",\n \"keyboard-settings-outline\",\n \"keyboard-space\",\n \"keyboard-tab\",\n \"keyboard-tab-reverse\",\n \"keyboard-variant\",\n \"khanda\",\n \"kickstarter\",\n \"kite\",\n \"kite-outline\",\n \"kitesurfing\",\n \"klingon\",\n \"knife\",\n \"knife-military\",\n \"knob\",\n \"koala\",\n \"kodi\",\n \"kubernetes\",\n \"label\",\n \"label-multiple\",\n \"label-multiple-outline\",\n \"label-off\",\n \"label-off-outline\",\n \"label-outline\",\n \"label-percent\",\n \"label-percent-outline\",\n \"label-variant\",\n \"label-variant-outline\",\n \"ladder\",\n \"ladybug\",\n \"lambda\",\n \"lamp\",\n \"lamp-outline\",\n \"lamps\",\n \"lamps-outline\",\n \"lan\",\n \"lan-check\",\n \"lan-connect\",\n \"lan-disconnect\",\n \"lan-pending\",\n \"land-fields\",\n \"land-plots\",\n \"land-plots-circle\",\n \"land-plots-circle-variant\",\n \"land-plots-marker\",\n \"land-rows-horizontal\",\n \"land-rows-vertical\",\n \"landslide\",\n \"landslide-outline\",\n \"language-c\",\n \"language-cpp\",\n \"language-csharp\",\n \"language-css3\",\n \"language-fortran\",\n \"language-go\",\n \"language-haskell\",\n \"language-html5\",\n \"language-java\",\n \"language-javascript\",\n \"language-kotlin\",\n \"language-lua\",\n \"language-markdown\",\n \"language-markdown-outline\",\n \"language-php\",\n \"language-python\",\n \"language-r\",\n \"language-ruby\",\n \"language-ruby-on-rails\",\n \"language-rust\",\n \"language-swift\",\n \"language-typescript\",\n \"language-xaml\",\n \"laptop\",\n \"laptop-account\",\n \"laptop-off\",\n \"laravel\",\n \"laser-pointer\",\n \"lasso\",\n \"lastpass\",\n \"latitude\",\n \"launch\",\n \"lava-lamp\",\n \"layers\",\n \"layers-edit\",\n \"layers-minus\",\n \"layers-off\",\n \"layers-off-outline\",\n \"layers-outline\",\n \"layers-plus\",\n \"layers-remove\",\n \"layers-search\",\n \"layers-search-outline\",\n \"layers-triple\",\n \"layers-triple-outline\",\n \"lead-pencil\",\n \"leaf\",\n \"leaf-circle\",\n \"leaf-circle-outline\",\n \"leaf-maple\",\n \"leaf-maple-off\",\n \"leaf-off\",\n \"leak\",\n \"leak-off\",\n \"lectern\",\n \"led-off\",\n \"led-on\",\n \"led-outline\",\n \"led-strip\",\n \"led-strip-variant\",\n \"led-strip-variant-off\",\n \"led-variant-off\",\n \"led-variant-on\",\n \"led-variant-outline\",\n \"leek\",\n \"less-than\",\n \"less-than-or-equal\",\n \"library\",\n \"library-outline\",\n \"library-shelves\",\n \"license\",\n \"lifebuoy\",\n \"light-flood-down\",\n \"light-flood-up\",\n \"light-recessed\",\n \"light-switch\",\n \"light-switch-off\",\n \"lightbulb\",\n \"lightbulb-alert\",\n \"lightbulb-alert-outline\",\n \"lightbulb-auto\",\n \"lightbulb-auto-outline\",\n \"lightbulb-cfl\",\n \"lightbulb-cfl-off\",\n \"lightbulb-cfl-spiral\",\n \"lightbulb-cfl-spiral-off\",\n \"lightbulb-fluorescent-tube\",\n \"lightbulb-fluorescent-tube-outline\",\n \"lightbulb-group\",\n \"lightbulb-group-off\",\n \"lightbulb-group-off-outline\",\n \"lightbulb-group-outline\",\n \"lightbulb-multiple\",\n \"lightbulb-multiple-off\",\n \"lightbulb-multiple-off-outline\",\n \"lightbulb-multiple-outline\",\n \"lightbulb-night\",\n \"lightbulb-night-outline\",\n \"lightbulb-off\",\n \"lightbulb-off-outline\",\n \"lightbulb-on\",\n \"lightbulb-on-10\",\n \"lightbulb-on-20\",\n \"lightbulb-on-30\",\n \"lightbulb-on-40\",\n \"lightbulb-on-50\",\n \"lightbulb-on-60\",\n \"lightbulb-on-70\",\n \"lightbulb-on-80\",\n \"lightbulb-on-90\",\n \"lightbulb-on-outline\",\n \"lightbulb-outline\",\n \"lightbulb-question\",\n \"lightbulb-question-outline\",\n \"lightbulb-spot\",\n \"lightbulb-spot-off\",\n \"lightbulb-variant\",\n \"lightbulb-variant-outline\",\n \"lighthouse\",\n \"lighthouse-on\",\n \"lightning-bolt\",\n \"lightning-bolt-circle\",\n \"lightning-bolt-outline\",\n \"line-scan\",\n \"lingerie\",\n \"link\",\n \"link-box\",\n \"link-box-outline\",\n \"link-box-variant\",\n \"link-box-variant-outline\",\n \"link-circle\",\n \"link-circle-outline\",\n \"link-edit\",\n \"link-lock\",\n \"link-off\",\n \"link-plus\",\n \"link-variant\",\n \"link-variant-minus\",\n \"link-variant-off\",\n \"link-variant-plus\",\n \"link-variant-remove\",\n \"linkedin\",\n \"linux\",\n \"linux-mint\",\n \"lipstick\",\n \"liquid-spot\",\n \"liquor\",\n \"list-box\",\n \"list-box-outline\",\n \"list-status\",\n \"litecoin\",\n \"loading\",\n \"location-enter\",\n \"location-exit\",\n \"lock\",\n \"lock-alert\",\n \"lock-alert-outline\",\n \"lock-check\",\n \"lock-check-outline\",\n \"lock-clock\",\n \"lock-minus\",\n \"lock-minus-outline\",\n \"lock-off\",\n \"lock-off-outline\",\n \"lock-open\",\n \"lock-open-alert\",\n \"lock-open-alert-outline\",\n \"lock-open-check\",\n \"lock-open-check-outline\",\n \"lock-open-minus\",\n \"lock-open-minus-outline\",\n \"lock-open-outline\",\n \"lock-open-plus\",\n \"lock-open-plus-outline\",\n \"lock-open-remove\",\n \"lock-open-remove-outline\",\n \"lock-open-variant\",\n \"lock-open-variant-outline\",\n \"lock-outline\",\n \"lock-pattern\",\n \"lock-percent\",\n \"lock-percent-open\",\n \"lock-percent-open-outline\",\n \"lock-percent-open-variant\",\n \"lock-percent-open-variant-outline\",\n \"lock-percent-outline\",\n \"lock-plus\",\n \"lock-plus-outline\",\n \"lock-question\",\n \"lock-remove\",\n \"lock-remove-outline\",\n \"lock-reset\",\n \"lock-smart\",\n \"locker\",\n \"locker-multiple\",\n \"login\",\n \"login-variant\",\n \"logout\",\n \"logout-variant\",\n \"longitude\",\n \"looks\",\n \"lotion\",\n \"lotion-outline\",\n \"lotion-plus\",\n \"lotion-plus-outline\",\n \"loupe\",\n \"lumx\",\n \"lungs\",\n \"mace\",\n \"magazine-pistol\",\n \"magazine-rifle\",\n \"magic-staff\",\n \"magnet\",\n \"magnet-on\",\n \"magnify\",\n \"magnify-close\",\n \"magnify-expand\",\n \"magnify-minus\",\n \"magnify-minus-cursor\",\n \"magnify-minus-outline\",\n \"magnify-plus\",\n \"magnify-plus-cursor\",\n \"magnify-plus-outline\",\n \"magnify-remove-cursor\",\n \"magnify-remove-outline\",\n \"magnify-scan\",\n \"mail\",\n \"mailbox\",\n \"mailbox-open\",\n \"mailbox-open-outline\",\n \"mailbox-open-up\",\n \"mailbox-open-up-outline\",\n \"mailbox-outline\",\n \"mailbox-up\",\n \"mailbox-up-outline\",\n \"manjaro\",\n \"map\",\n \"map-check\",\n \"map-check-outline\",\n \"map-clock\",\n \"map-clock-outline\",\n \"map-legend\",\n \"map-marker\",\n \"map-marker-account\",\n \"map-marker-account-outline\",\n \"map-marker-alert\",\n \"map-marker-alert-outline\",\n \"map-marker-check\",\n \"map-marker-check-outline\",\n \"map-marker-circle\",\n \"map-marker-distance\",\n \"map-marker-down\",\n \"map-marker-left\",\n \"map-marker-left-outline\",\n \"map-marker-minus\",\n \"map-marker-minus-outline\",\n \"map-marker-multiple\",\n \"map-marker-multiple-outline\",\n \"map-marker-off\",\n \"map-marker-off-outline\",\n \"map-marker-outline\",\n \"map-marker-path\",\n \"map-marker-plus\",\n \"map-marker-plus-outline\",\n \"map-marker-question\",\n \"map-marker-question-outline\",\n \"map-marker-radius\",\n \"map-marker-radius-outline\",\n \"map-marker-remove\",\n \"map-marker-remove-outline\",\n \"map-marker-remove-variant\",\n \"map-marker-right\",\n \"map-marker-right-outline\",\n \"map-marker-star\",\n \"map-marker-star-outline\",\n \"map-marker-up\",\n \"map-minus\",\n \"map-outline\",\n \"map-plus\",\n \"map-search\",\n \"map-search-outline\",\n \"mapbox\",\n \"margin\",\n \"marker\",\n \"marker-cancel\",\n \"marker-check\",\n \"mastodon\",\n \"material-design\",\n \"material-ui\",\n \"math-compass\",\n \"math-cos\",\n \"math-integral\",\n \"math-integral-box\",\n \"math-log\",\n \"math-norm\",\n \"math-norm-box\",\n \"math-sin\",\n \"math-tan\",\n \"matrix\",\n \"medal\",\n \"medal-outline\",\n \"medical-bag\",\n \"medical-cotton-swab\",\n \"medication\",\n \"medication-outline\",\n \"meditation\",\n \"memory\",\n \"memory-arrow-down\",\n \"menorah\",\n \"menorah-fire\",\n \"menu\",\n \"menu-close\",\n \"menu-down\",\n \"menu-down-outline\",\n \"menu-left\",\n \"menu-left-outline\",\n \"menu-open\",\n \"menu-right\",\n \"menu-right-outline\",\n \"menu-swap\",\n \"menu-swap-outline\",\n \"menu-up\",\n \"menu-up-outline\",\n \"merge\",\n \"message\",\n \"message-alert\",\n \"message-alert-outline\",\n \"message-arrow-left\",\n \"message-arrow-left-outline\",\n \"message-arrow-right\",\n \"message-arrow-right-outline\",\n \"message-badge\",\n \"message-badge-outline\",\n \"message-bookmark\",\n \"message-bookmark-outline\",\n \"message-bulleted\",\n \"message-bulleted-off\",\n \"message-check\",\n \"message-check-outline\",\n \"message-cog\",\n \"message-cog-outline\",\n \"message-draw\",\n \"message-fast\",\n \"message-fast-outline\",\n \"message-flash\",\n \"message-flash-outline\",\n \"message-image\",\n \"message-image-outline\",\n \"message-lock\",\n \"message-lock-outline\",\n \"message-minus\",\n \"message-minus-outline\",\n \"message-off\",\n \"message-off-outline\",\n \"message-outline\",\n \"message-plus\",\n \"message-plus-outline\",\n \"message-processing\",\n \"message-processing-outline\",\n \"message-question\",\n \"message-question-outline\",\n \"message-reply\",\n \"message-reply-outline\",\n \"message-reply-text\",\n \"message-reply-text-outline\",\n \"message-settings\",\n \"message-settings-outline\",\n \"message-star\",\n \"message-star-outline\",\n \"message-text\",\n \"message-text-clock\",\n \"message-text-clock-outline\",\n \"message-text-fast\",\n \"message-text-fast-outline\",\n \"message-text-lock\",\n \"message-text-lock-outline\",\n \"message-text-outline\",\n \"message-video\",\n \"meteor\",\n \"meter-electric\",\n \"meter-electric-outline\",\n \"meter-gas\",\n \"meter-gas-outline\",\n \"metronome\",\n \"metronome-tick\",\n \"micro-sd\",\n \"microphone\",\n \"microphone-message\",\n \"microphone-message-off\",\n \"microphone-minus\",\n \"microphone-off\",\n \"microphone-outline\",\n \"microphone-plus\",\n \"microphone-question\",\n \"microphone-question-outline\",\n \"microphone-settings\",\n \"microphone-variant\",\n \"microphone-variant-off\",\n \"microscope\",\n \"microsoft\",\n \"microsoft-access\",\n \"microsoft-azure\",\n \"microsoft-azure-devops\",\n \"microsoft-bing\",\n \"microsoft-dynamics-365\",\n \"microsoft-edge\",\n \"microsoft-excel\",\n \"microsoft-internet-explorer\",\n \"microsoft-office\",\n \"microsoft-onedrive\",\n \"microsoft-onenote\",\n \"microsoft-outlook\",\n \"microsoft-powerpoint\",\n \"microsoft-sharepoint\",\n \"microsoft-teams\",\n \"microsoft-visual-studio\",\n \"microsoft-visual-studio-code\",\n \"microsoft-windows\",\n \"microsoft-windows-classic\",\n \"microsoft-word\",\n \"microsoft-xbox\",\n \"microsoft-xbox-controller\",\n \"microsoft-xbox-controller-battery-alert\",\n \"microsoft-xbox-controller-battery-charging\",\n \"microsoft-xbox-controller-battery-empty\",\n \"microsoft-xbox-controller-battery-full\",\n \"microsoft-xbox-controller-battery-low\",\n \"microsoft-xbox-controller-battery-medium\",\n \"microsoft-xbox-controller-battery-unknown\",\n \"microsoft-xbox-controller-menu\",\n \"microsoft-xbox-controller-off\",\n \"microsoft-xbox-controller-view\",\n \"microwave\",\n \"microwave-off\",\n \"middleware\",\n \"middleware-outline\",\n \"midi\",\n \"midi-port\",\n \"mine\",\n \"minecraft\",\n \"mini-sd\",\n \"minidisc\",\n \"minus\",\n \"minus-box\",\n \"minus-box-multiple\",\n \"minus-box-multiple-outline\",\n \"minus-box-outline\",\n \"minus-circle\",\n \"minus-circle-multiple\",\n \"minus-circle-multiple-outline\",\n \"minus-circle-off\",\n \"minus-circle-off-outline\",\n \"minus-circle-outline\",\n \"minus-network\",\n \"minus-network-outline\",\n \"minus-thick\",\n \"mirror\",\n \"mirror-rectangle\",\n \"mirror-variant\",\n \"mixed-martial-arts\",\n \"mixed-reality\",\n \"molecule\",\n \"molecule-co\",\n \"molecule-co2\",\n \"monitor\",\n \"monitor-account\",\n \"monitor-arrow-down\",\n \"monitor-arrow-down-variant\",\n \"monitor-cellphone\",\n \"monitor-cellphone-star\",\n \"monitor-dashboard\",\n \"monitor-edit\",\n \"monitor-eye\",\n \"monitor-lock\",\n \"monitor-multiple\",\n \"monitor-off\",\n \"monitor-screenshot\",\n \"monitor-share\",\n \"monitor-shimmer\",\n \"monitor-small\",\n \"monitor-speaker\",\n \"monitor-speaker-off\",\n \"monitor-star\",\n \"monitor-vertical\",\n \"moon-first-quarter\",\n \"moon-full\",\n \"moon-last-quarter\",\n \"moon-new\",\n \"moon-waning-crescent\",\n \"moon-waning-gibbous\",\n \"moon-waxing-crescent\",\n \"moon-waxing-gibbous\",\n \"moped\",\n \"moped-electric\",\n \"moped-electric-outline\",\n \"moped-outline\",\n \"more\",\n \"mortar-pestle\",\n \"mortar-pestle-plus\",\n \"mosque\",\n \"mosque-outline\",\n \"mother-heart\",\n \"mother-nurse\",\n \"motion\",\n \"motion-outline\",\n \"motion-pause\",\n \"motion-pause-outline\",\n \"motion-play\",\n \"motion-play-outline\",\n \"motion-sensor\",\n \"motion-sensor-off\",\n \"motorbike\",\n \"motorbike-electric\",\n \"motorbike-off\",\n \"mouse\",\n \"mouse-bluetooth\",\n \"mouse-left-click\",\n \"mouse-left-click-outline\",\n \"mouse-move-down\",\n \"mouse-move-up\",\n \"mouse-move-vertical\",\n \"mouse-off\",\n \"mouse-outline\",\n \"mouse-right-click\",\n \"mouse-right-click-outline\",\n \"mouse-scroll-wheel\",\n \"mouse-variant\",\n \"mouse-variant-off\",\n \"move-resize\",\n \"move-resize-variant\",\n \"movie\",\n \"movie-check\",\n \"movie-check-outline\",\n \"movie-cog\",\n \"movie-cog-outline\",\n \"movie-edit\",\n \"movie-edit-outline\",\n \"movie-filter\",\n \"movie-filter-outline\",\n \"movie-minus\",\n \"movie-minus-outline\",\n \"movie-off\",\n \"movie-off-outline\",\n \"movie-open\",\n \"movie-open-check\",\n \"movie-open-check-outline\",\n \"movie-open-cog\",\n \"movie-open-cog-outline\",\n \"movie-open-edit\",\n \"movie-open-edit-outline\",\n \"movie-open-minus\",\n \"movie-open-minus-outline\",\n \"movie-open-off\",\n \"movie-open-off-outline\",\n \"movie-open-outline\",\n \"movie-open-play\",\n \"movie-open-play-outline\",\n \"movie-open-plus\",\n \"movie-open-plus-outline\",\n \"movie-open-remove\",\n \"movie-open-remove-outline\",\n \"movie-open-settings\",\n \"movie-open-settings-outline\",\n \"movie-open-star\",\n \"movie-open-star-outline\",\n \"movie-outline\",\n \"movie-play\",\n \"movie-play-outline\",\n \"movie-plus\",\n \"movie-plus-outline\",\n \"movie-remove\",\n \"movie-remove-outline\",\n \"movie-roll\",\n \"movie-search\",\n \"movie-search-outline\",\n \"movie-settings\",\n \"movie-settings-outline\",\n \"movie-star\",\n \"movie-star-outline\",\n \"mower\",\n \"mower-bag\",\n \"mower-bag-on\",\n \"mower-on\",\n \"muffin\",\n \"multicast\",\n \"multimedia\",\n \"multiplication\",\n \"multiplication-box\",\n \"mushroom\",\n \"mushroom-off\",\n \"mushroom-off-outline\",\n \"mushroom-outline\",\n \"music\",\n \"music-accidental-double-flat\",\n \"music-accidental-double-sharp\",\n \"music-accidental-flat\",\n \"music-accidental-natural\",\n \"music-accidental-sharp\",\n \"music-box\",\n \"music-box-multiple\",\n \"music-box-multiple-outline\",\n \"music-box-outline\",\n \"music-circle\",\n \"music-circle-outline\",\n \"music-clef-alto\",\n \"music-clef-bass\",\n \"music-clef-treble\",\n \"music-note\",\n \"music-note-bluetooth\",\n \"music-note-bluetooth-off\",\n \"music-note-eighth\",\n \"music-note-eighth-dotted\",\n \"music-note-half\",\n \"music-note-half-dotted\",\n \"music-note-minus\",\n \"music-note-off\",\n \"music-note-off-outline\",\n \"music-note-outline\",\n \"music-note-plus\",\n \"music-note-quarter\",\n \"music-note-quarter-dotted\",\n \"music-note-sixteenth\",\n \"music-note-sixteenth-dotted\",\n \"music-note-whole\",\n \"music-note-whole-dotted\",\n \"music-off\",\n \"music-rest-eighth\",\n \"music-rest-half\",\n \"music-rest-quarter\",\n \"music-rest-sixteenth\",\n \"music-rest-whole\",\n \"mustache\",\n \"nail\",\n \"nas\",\n \"nativescript\",\n \"nature\",\n \"nature-outline\",\n \"nature-people\",\n \"nature-people-outline\",\n \"navigation\",\n \"navigation-outline\",\n \"navigation-variant\",\n \"navigation-variant-outline\",\n \"near-me\",\n \"necklace\",\n \"needle\",\n \"needle-off\",\n \"netflix\",\n \"network\",\n \"network-off\",\n \"network-off-outline\",\n \"network-outline\",\n \"network-pos\",\n \"network-strength-1\",\n \"network-strength-1-alert\",\n \"network-strength-2\",\n \"network-strength-2-alert\",\n \"network-strength-3\",\n \"network-strength-3-alert\",\n \"network-strength-4\",\n \"network-strength-4-alert\",\n \"network-strength-4-cog\",\n \"network-strength-off\",\n \"network-strength-off-outline\",\n \"network-strength-outline\",\n \"new-box\",\n \"newspaper\",\n \"newspaper-check\",\n \"newspaper-minus\",\n \"newspaper-plus\",\n \"newspaper-remove\",\n \"newspaper-variant\",\n \"newspaper-variant-multiple\",\n \"newspaper-variant-multiple-outline\",\n \"newspaper-variant-outline\",\n \"nfc\",\n \"nfc-search-variant\",\n \"nfc-tap\",\n \"nfc-variant\",\n \"nfc-variant-off\",\n \"ninja\",\n \"nintendo-game-boy\",\n \"nintendo-switch\",\n \"nintendo-wii\",\n \"nintendo-wiiu\",\n \"nix\",\n \"nodejs\",\n \"noodles\",\n \"not-equal\",\n \"not-equal-variant\",\n \"note\",\n \"note-alert\",\n \"note-alert-outline\",\n \"note-check\",\n \"note-check-outline\",\n \"note-edit\",\n \"note-edit-outline\",\n \"note-minus\",\n \"note-minus-outline\",\n \"note-multiple\",\n \"note-multiple-outline\",\n \"note-off\",\n \"note-off-outline\",\n \"note-outline\",\n \"note-plus\",\n \"note-plus-outline\",\n \"note-remove\",\n \"note-remove-outline\",\n \"note-search\",\n \"note-search-outline\",\n \"note-text\",\n \"note-text-outline\",\n \"notebook\",\n \"notebook-check\",\n \"notebook-check-outline\",\n \"notebook-edit\",\n \"notebook-edit-outline\",\n \"notebook-heart\",\n \"notebook-heart-outline\",\n \"notebook-minus\",\n \"notebook-minus-outline\",\n \"notebook-multiple\",\n \"notebook-outline\",\n \"notebook-plus\",\n \"notebook-plus-outline\",\n \"notebook-remove\",\n \"notebook-remove-outline\",\n \"notification-clear-all\",\n \"npm\",\n \"nuke\",\n \"null\",\n \"numeric\",\n \"numeric-0\",\n \"numeric-0-box\",\n \"numeric-0-box-multiple\",\n \"numeric-0-box-multiple-outline\",\n \"numeric-0-box-outline\",\n \"numeric-0-circle\",\n \"numeric-0-circle-outline\",\n \"numeric-1\",\n \"numeric-1-box\",\n \"numeric-1-box-multiple\",\n \"numeric-1-box-multiple-outline\",\n \"numeric-1-box-outline\",\n \"numeric-1-circle\",\n \"numeric-1-circle-outline\",\n \"numeric-10\",\n \"numeric-10-box\",\n \"numeric-10-box-multiple\",\n \"numeric-10-box-multiple-outline\",\n \"numeric-10-box-outline\",\n \"numeric-10-circle\",\n \"numeric-10-circle-outline\",\n \"numeric-2\",\n \"numeric-2-box\",\n \"numeric-2-box-multiple\",\n \"numeric-2-box-multiple-outline\",\n \"numeric-2-box-outline\",\n \"numeric-2-circle\",\n \"numeric-2-circle-outline\",\n \"numeric-3\",\n \"numeric-3-box\",\n \"numeric-3-box-multiple\",\n \"numeric-3-box-multiple-outline\",\n \"numeric-3-box-outline\",\n \"numeric-3-circle\",\n \"numeric-3-circle-outline\",\n \"numeric-4\",\n \"numeric-4-box\",\n \"numeric-4-box-multiple\",\n \"numeric-4-box-multiple-outline\",\n \"numeric-4-box-outline\",\n \"numeric-4-circle\",\n \"numeric-4-circle-outline\",\n \"numeric-5\",\n \"numeric-5-box\",\n \"numeric-5-box-multiple\",\n \"numeric-5-box-multiple-outline\",\n \"numeric-5-box-outline\",\n \"numeric-5-circle\",\n \"numeric-5-circle-outline\",\n \"numeric-6\",\n \"numeric-6-box\",\n \"numeric-6-box-multiple\",\n \"numeric-6-box-multiple-outline\",\n \"numeric-6-box-outline\",\n \"numeric-6-circle\",\n \"numeric-6-circle-outline\",\n \"numeric-7\",\n \"numeric-7-box\",\n \"numeric-7-box-multiple\",\n \"numeric-7-box-multiple-outline\",\n \"numeric-7-box-outline\",\n \"numeric-7-circle\",\n \"numeric-7-circle-outline\",\n \"numeric-8\",\n \"numeric-8-box\",\n \"numeric-8-box-multiple\",\n \"numeric-8-box-multiple-outline\",\n \"numeric-8-box-outline\",\n \"numeric-8-circle\",\n \"numeric-8-circle-outline\",\n \"numeric-9\",\n \"numeric-9-box\",\n \"numeric-9-box-multiple\",\n \"numeric-9-box-multiple-outline\",\n \"numeric-9-box-outline\",\n \"numeric-9-circle\",\n \"numeric-9-circle-outline\",\n \"numeric-9-plus\",\n \"numeric-9-plus-box\",\n \"numeric-9-plus-box-multiple\",\n \"numeric-9-plus-box-multiple-outline\",\n \"numeric-9-plus-box-outline\",\n \"numeric-9-plus-circle\",\n \"numeric-9-plus-circle-outline\",\n \"numeric-negative-1\",\n \"numeric-off\",\n \"numeric-positive-1\",\n \"nut\",\n \"nutrition\",\n \"nuxt\",\n \"oar\",\n \"ocarina\",\n \"oci\",\n \"ocr\",\n \"octagon\",\n \"octagon-outline\",\n \"octagram\",\n \"octagram-edit\",\n \"octagram-edit-outline\",\n \"octagram-minus\",\n \"octagram-minus-outline\",\n \"octagram-outline\",\n \"octagram-plus\",\n \"octagram-plus-outline\",\n \"octahedron\",\n \"octahedron-off\",\n \"odnoklassniki\",\n \"offer\",\n \"office-building\",\n \"office-building-cog\",\n \"office-building-cog-outline\",\n \"office-building-marker\",\n \"office-building-marker-outline\",\n \"office-building-minus\",\n \"office-building-minus-outline\",\n \"office-building-outline\",\n \"office-building-plus\",\n \"office-building-plus-outline\",\n \"office-building-remove\",\n \"office-building-remove-outline\",\n \"oil\",\n \"oil-lamp\",\n \"oil-level\",\n \"oil-temperature\",\n \"om\",\n \"omega\",\n \"one-up\",\n \"onepassword\",\n \"opacity\",\n \"open-in-app\",\n \"open-in-new\",\n \"open-source-initiative\",\n \"openid\",\n \"opera\",\n \"orbit\",\n \"orbit-variant\",\n \"order-alphabetical-ascending\",\n \"order-alphabetical-descending\",\n \"order-bool-ascending\",\n \"order-bool-ascending-variant\",\n \"order-bool-descending\",\n \"order-bool-descending-variant\",\n \"order-numeric-ascending\",\n \"order-numeric-descending\",\n \"origin\",\n \"ornament\",\n \"ornament-variant\",\n \"outdoor-lamp\",\n \"overscan\",\n \"owl\",\n \"pac-man\",\n \"package\",\n \"package-check\",\n \"package-down\",\n \"package-up\",\n \"package-variant\",\n \"package-variant-closed\",\n \"package-variant-closed-check\",\n \"package-variant-closed-minus\",\n \"package-variant-closed-plus\",\n \"package-variant-closed-remove\",\n \"package-variant-minus\",\n \"package-variant-plus\",\n \"package-variant-remove\",\n \"page-first\",\n \"page-last\",\n \"page-layout-body\",\n \"page-layout-footer\",\n \"page-layout-header\",\n \"page-layout-header-footer\",\n \"page-layout-sidebar-left\",\n \"page-layout-sidebar-right\",\n \"page-next\",\n \"page-next-outline\",\n \"page-previous\",\n \"page-previous-outline\",\n \"pail\",\n \"pail-minus\",\n \"pail-minus-outline\",\n \"pail-off\",\n \"pail-off-outline\",\n \"pail-outline\",\n \"pail-plus\",\n \"pail-plus-outline\",\n \"pail-remove\",\n \"pail-remove-outline\",\n \"palette\",\n \"palette-advanced\",\n \"palette-outline\",\n \"palette-swatch\",\n \"palette-swatch-outline\",\n \"palette-swatch-variant\",\n \"palm-tree\",\n \"pan\",\n \"pan-bottom-left\",\n \"pan-bottom-right\",\n \"pan-down\",\n \"pan-horizontal\",\n \"pan-left\",\n \"pan-right\",\n \"pan-top-left\",\n \"pan-top-right\",\n \"pan-up\",\n \"pan-vertical\",\n \"panda\",\n \"pandora\",\n \"panorama\",\n \"panorama-fisheye\",\n \"panorama-horizontal\",\n \"panorama-horizontal-outline\",\n \"panorama-outline\",\n \"panorama-sphere\",\n \"panorama-sphere-outline\",\n \"panorama-variant\",\n \"panorama-variant-outline\",\n \"panorama-vertical\",\n \"panorama-vertical-outline\",\n \"panorama-wide-angle\",\n \"panorama-wide-angle-outline\",\n \"paper-cut-vertical\",\n \"paper-roll\",\n \"paper-roll-outline\",\n \"paperclip\",\n \"paperclip-check\",\n \"paperclip-lock\",\n \"paperclip-minus\",\n \"paperclip-off\",\n \"paperclip-plus\",\n \"paperclip-remove\",\n \"parachute\",\n \"parachute-outline\",\n \"paragliding\",\n \"parking\",\n \"party-popper\",\n \"passport\",\n \"passport-alert\",\n \"passport-biometric\",\n \"passport-cancel\",\n \"passport-check\",\n \"passport-minus\",\n \"passport-plus\",\n \"passport-remove\",\n \"pasta\",\n \"patio-heater\",\n \"patreon\",\n \"pause\",\n \"pause-box\",\n \"pause-box-outline\",\n \"pause-circle\",\n \"pause-circle-outline\",\n \"pause-octagon\",\n \"pause-octagon-outline\",\n \"paw\",\n \"paw-off\",\n \"paw-off-outline\",\n \"paw-outline\",\n \"peace\",\n \"peanut\",\n \"peanut-off\",\n \"peanut-off-outline\",\n \"peanut-outline\",\n \"pen\",\n \"pen-lock\",\n \"pen-minus\",\n \"pen-off\",\n \"pen-plus\",\n \"pen-remove\",\n \"pencil\",\n \"pencil-box\",\n \"pencil-box-multiple\",\n \"pencil-box-multiple-outline\",\n \"pencil-box-outline\",\n \"pencil-circle\",\n \"pencil-circle-outline\",\n \"pencil-lock\",\n \"pencil-lock-outline\",\n \"pencil-minus\",\n \"pencil-minus-outline\",\n \"pencil-off\",\n \"pencil-off-outline\",\n \"pencil-outline\",\n \"pencil-plus\",\n \"pencil-plus-outline\",\n \"pencil-remove\",\n \"pencil-remove-outline\",\n \"pencil-ruler\",\n \"pencil-ruler-outline\",\n \"penguin\",\n \"pentagon\",\n \"pentagon-outline\",\n \"pentagram\",\n \"percent\",\n \"percent-box\",\n \"percent-box-outline\",\n \"percent-circle\",\n \"percent-circle-outline\",\n \"percent-outline\",\n \"periodic-table\",\n \"perspective-less\",\n \"perspective-more\",\n \"ph\",\n \"phone\",\n \"phone-alert\",\n \"phone-alert-outline\",\n \"phone-bluetooth\",\n \"phone-bluetooth-outline\",\n \"phone-cancel\",\n \"phone-cancel-outline\",\n \"phone-check\",\n \"phone-check-outline\",\n \"phone-classic\",\n \"phone-classic-off\",\n \"phone-clock\",\n \"phone-dial\",\n \"phone-dial-outline\",\n \"phone-forward\",\n \"phone-forward-outline\",\n \"phone-hangup\",\n \"phone-hangup-outline\",\n \"phone-in-talk\",\n \"phone-in-talk-outline\",\n \"phone-incoming\",\n \"phone-incoming-outgoing\",\n \"phone-incoming-outgoing-outline\",\n \"phone-incoming-outline\",\n \"phone-lock\",\n \"phone-lock-outline\",\n \"phone-log\",\n \"phone-log-outline\",\n \"phone-message\",\n \"phone-message-outline\",\n \"phone-minus\",\n \"phone-minus-outline\",\n \"phone-missed\",\n \"phone-missed-outline\",\n \"phone-off\",\n \"phone-off-outline\",\n \"phone-outgoing\",\n \"phone-outgoing-outline\",\n \"phone-outline\",\n \"phone-paused\",\n \"phone-paused-outline\",\n \"phone-plus\",\n \"phone-plus-outline\",\n \"phone-refresh\",\n \"phone-refresh-outline\",\n \"phone-remove\",\n \"phone-remove-outline\",\n \"phone-return\",\n \"phone-return-outline\",\n \"phone-ring\",\n \"phone-ring-outline\",\n \"phone-rotate-landscape\",\n \"phone-rotate-portrait\",\n \"phone-settings\",\n \"phone-settings-outline\",\n \"phone-sync\",\n \"phone-sync-outline\",\n \"phone-voip\",\n \"pi\",\n \"pi-box\",\n \"pi-hole\",\n \"piano\",\n \"piano-off\",\n \"pickaxe\",\n \"picture-in-picture-bottom-right\",\n \"picture-in-picture-bottom-right-outline\",\n \"picture-in-picture-top-right\",\n \"picture-in-picture-top-right-outline\",\n \"pier\",\n \"pier-crane\",\n \"pig\",\n \"pig-variant\",\n \"pig-variant-outline\",\n \"piggy-bank\",\n \"piggy-bank-outline\",\n \"pill\",\n \"pill-multiple\",\n \"pill-off\",\n \"pillar\",\n \"pin\",\n \"pin-off\",\n \"pin-off-outline\",\n \"pin-outline\",\n \"pine-tree\",\n \"pine-tree-box\",\n \"pine-tree-fire\",\n \"pine-tree-variant\",\n \"pine-tree-variant-outline\",\n \"pinterest\",\n \"pinwheel\",\n \"pinwheel-outline\",\n \"pipe\",\n \"pipe-disconnected\",\n \"pipe-leak\",\n \"pipe-valve\",\n \"pipe-wrench\",\n \"pirate\",\n \"pistol\",\n \"piston\",\n \"pitchfork\",\n \"pizza\",\n \"plane-car\",\n \"plane-train\",\n \"play\",\n \"play-box\",\n \"play-box-edit-outline\",\n \"play-box-lock\",\n \"play-box-lock-open\",\n \"play-box-lock-open-outline\",\n \"play-box-lock-outline\",\n \"play-box-multiple\",\n \"play-box-multiple-outline\",\n \"play-box-outline\",\n \"play-circle\",\n \"play-circle-outline\",\n \"play-network\",\n \"play-network-outline\",\n \"play-outline\",\n \"play-pause\",\n \"play-protected-content\",\n \"play-speed\",\n \"playlist-check\",\n \"playlist-edit\",\n \"playlist-minus\",\n \"playlist-music\",\n \"playlist-music-outline\",\n \"playlist-play\",\n \"playlist-plus\",\n \"playlist-remove\",\n \"playlist-star\",\n \"plex\",\n \"pliers\",\n \"plus\",\n \"plus-box\",\n \"plus-box-multiple\",\n \"plus-box-multiple-outline\",\n \"plus-box-outline\",\n \"plus-circle\",\n \"plus-circle-multiple\",\n \"plus-circle-multiple-outline\",\n \"plus-circle-outline\",\n \"plus-lock\",\n \"plus-lock-open\",\n \"plus-minus\",\n \"plus-minus-box\",\n \"plus-minus-variant\",\n \"plus-network\",\n \"plus-network-outline\",\n \"plus-outline\",\n \"plus-thick\",\n \"pocket\",\n \"podcast\",\n \"podium\",\n \"podium-bronze\",\n \"podium-gold\",\n \"podium-silver\",\n \"point-of-sale\",\n \"pokeball\",\n \"pokemon-go\",\n \"poker-chip\",\n \"polaroid\",\n \"police-badge\",\n \"police-badge-outline\",\n \"police-station\",\n \"poll\",\n \"polo\",\n \"polymer\",\n \"pool\",\n \"pool-thermometer\",\n \"popcorn\",\n \"post\",\n \"post-lamp\",\n \"post-outline\",\n \"postage-stamp\",\n \"pot\",\n \"pot-mix\",\n \"pot-mix-outline\",\n \"pot-outline\",\n \"pot-steam\",\n \"pot-steam-outline\",\n \"pound\",\n \"pound-box\",\n \"pound-box-outline\",\n \"power\",\n \"power-cycle\",\n \"power-off\",\n \"power-on\",\n \"power-plug\",\n \"power-plug-battery\",\n \"power-plug-battery-outline\",\n \"power-plug-off\",\n \"power-plug-off-outline\",\n \"power-plug-outline\",\n \"power-settings\",\n \"power-sleep\",\n \"power-socket\",\n \"power-socket-au\",\n \"power-socket-ch\",\n \"power-socket-de\",\n \"power-socket-eu\",\n \"power-socket-fr\",\n \"power-socket-it\",\n \"power-socket-jp\",\n \"power-socket-uk\",\n \"power-socket-us\",\n \"power-standby\",\n \"powershell\",\n \"prescription\",\n \"presentation\",\n \"presentation-play\",\n \"pretzel\",\n \"printer\",\n \"printer-3d\",\n \"printer-3d-nozzle\",\n \"printer-3d-nozzle-alert\",\n \"printer-3d-nozzle-alert-outline\",\n \"printer-3d-nozzle-heat\",\n \"printer-3d-nozzle-heat-outline\",\n \"printer-3d-nozzle-off\",\n \"printer-3d-nozzle-off-outline\",\n \"printer-3d-nozzle-outline\",\n \"printer-3d-off\",\n \"printer-alert\",\n \"printer-check\",\n \"printer-eye\",\n \"printer-off\",\n \"printer-off-outline\",\n \"printer-outline\",\n \"printer-pos\",\n \"printer-pos-alert\",\n \"printer-pos-alert-outline\",\n \"printer-pos-cancel\",\n \"printer-pos-cancel-outline\",\n \"printer-pos-check\",\n \"printer-pos-check-outline\",\n \"printer-pos-cog\",\n \"printer-pos-cog-outline\",\n \"printer-pos-edit\",\n \"printer-pos-edit-outline\",\n \"printer-pos-minus\",\n \"printer-pos-minus-outline\",\n \"printer-pos-network\",\n \"printer-pos-network-outline\",\n \"printer-pos-off\",\n \"printer-pos-off-outline\",\n \"printer-pos-outline\",\n \"printer-pos-pause\",\n \"printer-pos-pause-outline\",\n \"printer-pos-play\",\n \"printer-pos-play-outline\",\n \"printer-pos-plus\",\n \"printer-pos-plus-outline\",\n \"printer-pos-refresh\",\n \"printer-pos-refresh-outline\",\n \"printer-pos-remove\",\n \"printer-pos-remove-outline\",\n \"printer-pos-star\",\n \"printer-pos-star-outline\",\n \"printer-pos-stop\",\n \"printer-pos-stop-outline\",\n \"printer-pos-sync\",\n \"printer-pos-sync-outline\",\n \"printer-pos-wrench\",\n \"printer-pos-wrench-outline\",\n \"printer-search\",\n \"printer-settings\",\n \"printer-wireless\",\n \"priority-high\",\n \"priority-low\",\n \"professional-hexagon\",\n \"progress-alert\",\n \"progress-check\",\n \"progress-clock\",\n \"progress-close\",\n \"progress-download\",\n \"progress-helper\",\n \"progress-pencil\",\n \"progress-question\",\n \"progress-star\",\n \"progress-star-four-points\",\n \"progress-tag\",\n \"progress-upload\",\n \"progress-wrench\",\n \"projector\",\n \"projector-off\",\n \"projector-screen\",\n \"projector-screen-off\",\n \"projector-screen-off-outline\",\n \"projector-screen-outline\",\n \"projector-screen-variant\",\n \"projector-screen-variant-off\",\n \"projector-screen-variant-off-outline\",\n \"projector-screen-variant-outline\",\n \"propane-tank\",\n \"propane-tank-outline\",\n \"protocol\",\n \"publish\",\n \"publish-off\",\n \"pulse\",\n \"pump\",\n \"pump-off\",\n \"pumpkin\",\n \"purse\",\n \"purse-outline\",\n \"puzzle\",\n \"puzzle-check\",\n \"puzzle-check-outline\",\n \"puzzle-edit\",\n \"puzzle-edit-outline\",\n \"puzzle-heart\",\n \"puzzle-heart-outline\",\n \"puzzle-minus\",\n \"puzzle-minus-outline\",\n \"puzzle-outline\",\n \"puzzle-plus\",\n \"puzzle-plus-outline\",\n \"puzzle-remove\",\n \"puzzle-remove-outline\",\n \"puzzle-star\",\n \"puzzle-star-outline\",\n \"pyramid\",\n \"pyramid-off\",\n \"qi\",\n \"qqchat\",\n \"qrcode\",\n \"qrcode-edit\",\n \"qrcode-minus\",\n \"qrcode-plus\",\n \"qrcode-remove\",\n \"qrcode-scan\",\n \"quadcopter\",\n \"quality-high\",\n \"quality-low\",\n \"quality-medium\",\n \"queue-first-in-last-out\",\n \"quora\",\n \"rabbit\",\n \"rabbit-variant\",\n \"rabbit-variant-outline\",\n \"racing-helmet\",\n \"racquetball\",\n \"radar\",\n \"radiator\",\n \"radiator-disabled\",\n \"radiator-off\",\n \"radio\",\n \"radio-am\",\n \"radio-fm\",\n \"radio-handheld\",\n \"radio-off\",\n \"radio-tower\",\n \"radioactive\",\n \"radioactive-circle\",\n \"radioactive-circle-outline\",\n \"radioactive-off\",\n \"radiobox-blank\",\n \"radiobox-indeterminate-variant\",\n \"radiobox-marked\",\n \"radiology-box\",\n \"radiology-box-outline\",\n \"radius\",\n \"radius-outline\",\n \"railroad-light\",\n \"rake\",\n \"raspberry-pi\",\n \"raw\",\n \"raw-off\",\n \"ray-end\",\n \"ray-end-arrow\",\n \"ray-start\",\n \"ray-start-arrow\",\n \"ray-start-end\",\n \"ray-start-vertex-end\",\n \"ray-vertex\",\n \"razor-double-edge\",\n \"razor-single-edge\",\n \"react\",\n \"read\",\n \"receipt\",\n \"receipt-clock\",\n \"receipt-clock-outline\",\n \"receipt-outline\",\n \"receipt-send\",\n \"receipt-send-outline\",\n \"receipt-text\",\n \"receipt-text-arrow-left\",\n \"receipt-text-arrow-left-outline\",\n \"receipt-text-arrow-right\",\n \"receipt-text-arrow-right-outline\",\n \"receipt-text-check\",\n \"receipt-text-check-outline\",\n \"receipt-text-clock\",\n \"receipt-text-clock-outline\",\n \"receipt-text-edit\",\n \"receipt-text-edit-outline\",\n \"receipt-text-minus\",\n \"receipt-text-minus-outline\",\n \"receipt-text-outline\",\n \"receipt-text-plus\",\n \"receipt-text-plus-outline\",\n \"receipt-text-remove\",\n \"receipt-text-remove-outline\",\n \"receipt-text-send\",\n \"receipt-text-send-outline\",\n \"record\",\n \"record-circle\",\n \"record-circle-outline\",\n \"record-player\",\n \"record-rec\",\n \"rectangle\",\n \"rectangle-outline\",\n \"recycle\",\n \"recycle-variant\",\n \"reddit\",\n \"redhat\",\n \"redo\",\n \"redo-variant\",\n \"reflect-horizontal\",\n \"reflect-vertical\",\n \"refresh\",\n \"refresh-auto\",\n \"refresh-circle\",\n \"regex\",\n \"registered-trademark\",\n \"reiterate\",\n \"relation-many-to-many\",\n \"relation-many-to-one\",\n \"relation-many-to-one-or-many\",\n \"relation-many-to-only-one\",\n \"relation-many-to-zero-or-many\",\n \"relation-many-to-zero-or-one\",\n \"relation-one-or-many-to-many\",\n \"relation-one-or-many-to-one\",\n \"relation-one-or-many-to-one-or-many\",\n \"relation-one-or-many-to-only-one\",\n \"relation-one-or-many-to-zero-or-many\",\n \"relation-one-or-many-to-zero-or-one\",\n \"relation-one-to-many\",\n \"relation-one-to-one\",\n \"relation-one-to-one-or-many\",\n \"relation-one-to-only-one\",\n \"relation-one-to-zero-or-many\",\n \"relation-one-to-zero-or-one\",\n \"relation-only-one-to-many\",\n \"relation-only-one-to-one\",\n \"relation-only-one-to-one-or-many\",\n \"relation-only-one-to-only-one\",\n \"relation-only-one-to-zero-or-many\",\n \"relation-only-one-to-zero-or-one\",\n \"relation-zero-or-many-to-many\",\n \"relation-zero-or-many-to-one\",\n \"relation-zero-or-many-to-one-or-many\",\n \"relation-zero-or-many-to-only-one\",\n \"relation-zero-or-many-to-zero-or-many\",\n \"relation-zero-or-many-to-zero-or-one\",\n \"relation-zero-or-one-to-many\",\n \"relation-zero-or-one-to-one\",\n \"relation-zero-or-one-to-one-or-many\",\n \"relation-zero-or-one-to-only-one\",\n \"relation-zero-or-one-to-zero-or-many\",\n \"relation-zero-or-one-to-zero-or-one\",\n \"relative-scale\",\n \"reload\",\n \"reload-alert\",\n \"reminder\",\n \"remote\",\n \"remote-desktop\",\n \"remote-off\",\n \"remote-tv\",\n \"remote-tv-off\",\n \"rename\",\n \"rename-box\",\n \"rename-box-outline\",\n \"rename-outline\",\n \"reorder-horizontal\",\n \"reorder-vertical\",\n \"repeat\",\n \"repeat-off\",\n \"repeat-once\",\n \"repeat-variant\",\n \"replay\",\n \"reply\",\n \"reply-all\",\n \"reply-all-outline\",\n \"reply-circle\",\n \"reply-outline\",\n \"reproduction\",\n \"resistor\",\n \"resistor-nodes\",\n \"resize\",\n \"resize-bottom-right\",\n \"responsive\",\n \"restart\",\n \"restart-alert\",\n \"restart-off\",\n \"restore\",\n \"restore-alert\",\n \"rewind\",\n \"rewind-10\",\n \"rewind-15\",\n \"rewind-30\",\n \"rewind-45\",\n \"rewind-5\",\n \"rewind-60\",\n \"rewind-outline\",\n \"rhombus\",\n \"rhombus-medium\",\n \"rhombus-medium-outline\",\n \"rhombus-outline\",\n \"rhombus-split\",\n \"rhombus-split-outline\",\n \"ribbon\",\n \"rice\",\n \"rickshaw\",\n \"rickshaw-electric\",\n \"ring\",\n \"rivet\",\n \"road\",\n \"road-variant\",\n \"robber\",\n \"robot\",\n \"robot-angry\",\n \"robot-angry-outline\",\n \"robot-confused\",\n \"robot-confused-outline\",\n \"robot-dead\",\n \"robot-dead-outline\",\n \"robot-excited\",\n \"robot-excited-outline\",\n \"robot-happy\",\n \"robot-happy-outline\",\n \"robot-industrial\",\n \"robot-industrial-outline\",\n \"robot-love\",\n \"robot-love-outline\",\n \"robot-mower\",\n \"robot-mower-outline\",\n \"robot-off\",\n \"robot-off-outline\",\n \"robot-outline\",\n \"robot-vacuum\",\n \"robot-vacuum-alert\",\n \"robot-vacuum-off\",\n \"robot-vacuum-variant\",\n \"robot-vacuum-variant-alert\",\n \"robot-vacuum-variant-off\",\n \"rocket\",\n \"rocket-launch\",\n \"rocket-launch-outline\",\n \"rocket-outline\",\n \"rodent\",\n \"roller-shade\",\n \"roller-shade-closed\",\n \"roller-skate\",\n \"roller-skate-off\",\n \"rollerblade\",\n \"rollerblade-off\",\n \"rollupjs\",\n \"rolodex\",\n \"rolodex-outline\",\n \"roman-numeral-1\",\n \"roman-numeral-10\",\n \"roman-numeral-2\",\n \"roman-numeral-3\",\n \"roman-numeral-4\",\n \"roman-numeral-5\",\n \"roman-numeral-6\",\n \"roman-numeral-7\",\n \"roman-numeral-8\",\n \"roman-numeral-9\",\n \"room-service\",\n \"room-service-outline\",\n \"rotate-360\",\n \"rotate-3d\",\n \"rotate-3d-variant\",\n \"rotate-left\",\n \"rotate-left-variant\",\n \"rotate-orbit\",\n \"rotate-right\",\n \"rotate-right-variant\",\n \"rounded-corner\",\n \"router\",\n \"router-network\",\n \"router-network-wireless\",\n \"router-wireless\",\n \"router-wireless-off\",\n \"router-wireless-settings\",\n \"routes\",\n \"routes-clock\",\n \"rowing\",\n \"rss\",\n \"rss-box\",\n \"rss-off\",\n \"rug\",\n \"rugby\",\n \"ruler\",\n \"ruler-square\",\n \"ruler-square-compass\",\n \"run\",\n \"run-fast\",\n \"rv-truck\",\n \"sack\",\n \"sack-outline\",\n \"sack-percent\",\n \"safe\",\n \"safe-square\",\n \"safe-square-outline\",\n \"safety-goggles\",\n \"sail-boat\",\n \"sail-boat-sink\",\n \"sale\",\n \"sale-outline\",\n \"salesforce\",\n \"sass\",\n \"satellite\",\n \"satellite-uplink\",\n \"satellite-variant\",\n \"sausage\",\n \"sausage-off\",\n \"saw-blade\",\n \"sawtooth-wave\",\n \"saxophone\",\n \"scale\",\n \"scale-balance\",\n \"scale-bathroom\",\n \"scale-off\",\n \"scale-unbalanced\",\n \"scan-helper\",\n \"scanner\",\n \"scanner-off\",\n \"scatter-plot\",\n \"scatter-plot-outline\",\n \"scent\",\n \"scent-off\",\n \"school\",\n \"school-outline\",\n \"scissors-cutting\",\n \"scooter\",\n \"scooter-electric\",\n \"scoreboard\",\n \"scoreboard-outline\",\n \"screen-rotation\",\n \"screen-rotation-lock\",\n \"screw-flat-top\",\n \"screw-lag\",\n \"screw-machine-flat-top\",\n \"screw-machine-round-top\",\n \"screw-round-top\",\n \"screwdriver\",\n \"script\",\n \"script-outline\",\n \"script-text\",\n \"script-text-key\",\n \"script-text-key-outline\",\n \"script-text-outline\",\n \"script-text-play\",\n \"script-text-play-outline\",\n \"sd\",\n \"seal\",\n \"seal-variant\",\n \"search-web\",\n \"seat\",\n \"seat-flat\",\n \"seat-flat-angled\",\n \"seat-individual-suite\",\n \"seat-legroom-extra\",\n \"seat-legroom-normal\",\n \"seat-legroom-reduced\",\n \"seat-outline\",\n \"seat-passenger\",\n \"seat-recline-extra\",\n \"seat-recline-normal\",\n \"seatbelt\",\n \"security\",\n \"security-network\",\n \"seed\",\n \"seed-off\",\n \"seed-off-outline\",\n \"seed-outline\",\n \"seed-plus\",\n \"seed-plus-outline\",\n \"seesaw\",\n \"segment\",\n \"select\",\n \"select-all\",\n \"select-arrow-down\",\n \"select-arrow-up\",\n \"select-color\",\n \"select-compare\",\n \"select-drag\",\n \"select-group\",\n \"select-inverse\",\n \"select-marker\",\n \"select-multiple\",\n \"select-multiple-marker\",\n \"select-off\",\n \"select-place\",\n \"select-remove\",\n \"select-search\",\n \"selection\",\n \"selection-drag\",\n \"selection-ellipse\",\n \"selection-ellipse-arrow-inside\",\n \"selection-ellipse-remove\",\n \"selection-marker\",\n \"selection-multiple\",\n \"selection-multiple-marker\",\n \"selection-off\",\n \"selection-remove\",\n \"selection-search\",\n \"semantic-web\",\n \"send\",\n \"send-check\",\n \"send-check-outline\",\n \"send-circle\",\n \"send-circle-outline\",\n \"send-clock\",\n \"send-clock-outline\",\n \"send-lock\",\n \"send-lock-outline\",\n \"send-outline\",\n \"send-variant\",\n \"send-variant-clock\",\n \"send-variant-clock-outline\",\n \"send-variant-outline\",\n \"serial-port\",\n \"server\",\n \"server-minus\",\n \"server-minus-outline\",\n \"server-network\",\n \"server-network-off\",\n \"server-network-outline\",\n \"server-off\",\n \"server-outline\",\n \"server-plus\",\n \"server-plus-outline\",\n \"server-remove\",\n \"server-security\",\n \"set-all\",\n \"set-center\",\n \"set-center-right\",\n \"set-left\",\n \"set-left-center\",\n \"set-left-right\",\n \"set-merge\",\n \"set-none\",\n \"set-right\",\n \"set-split\",\n \"set-square\",\n \"set-top-box\",\n \"settings-helper\",\n \"shaker\",\n \"shaker-outline\",\n \"shape\",\n \"shape-circle-plus\",\n \"shape-outline\",\n \"shape-oval-plus\",\n \"shape-plus\",\n \"shape-plus-outline\",\n \"shape-polygon-plus\",\n \"shape-rectangle-plus\",\n \"shape-square-plus\",\n \"shape-square-rounded-plus\",\n \"share\",\n \"share-all\",\n \"share-all-outline\",\n \"share-circle\",\n \"share-off\",\n \"share-off-outline\",\n \"share-outline\",\n \"share-variant\",\n \"share-variant-outline\",\n \"shark\",\n \"shark-fin\",\n \"shark-fin-outline\",\n \"shark-off\",\n \"sheep\",\n \"shield\",\n \"shield-account\",\n \"shield-account-outline\",\n \"shield-account-variant\",\n \"shield-account-variant-outline\",\n \"shield-airplane\",\n \"shield-airplane-outline\",\n \"shield-alert\",\n \"shield-alert-outline\",\n \"shield-bug\",\n \"shield-bug-outline\",\n \"shield-car\",\n \"shield-check\",\n \"shield-check-outline\",\n \"shield-cross\",\n \"shield-cross-outline\",\n \"shield-crown\",\n \"shield-crown-outline\",\n \"shield-edit\",\n \"shield-edit-outline\",\n \"shield-half\",\n \"shield-half-full\",\n \"shield-home\",\n \"shield-home-outline\",\n \"shield-key\",\n \"shield-key-outline\",\n \"shield-link-variant\",\n \"shield-link-variant-outline\",\n \"shield-lock\",\n \"shield-lock-open\",\n \"shield-lock-open-outline\",\n \"shield-lock-outline\",\n \"shield-moon\",\n \"shield-moon-outline\",\n \"shield-off\",\n \"shield-off-outline\",\n \"shield-outline\",\n \"shield-plus\",\n \"shield-plus-outline\",\n \"shield-refresh\",\n \"shield-refresh-outline\",\n \"shield-remove\",\n \"shield-remove-outline\",\n \"shield-search\",\n \"shield-star\",\n \"shield-star-outline\",\n \"shield-sun\",\n \"shield-sun-outline\",\n \"shield-sword\",\n \"shield-sword-outline\",\n \"shield-sync\",\n \"shield-sync-outline\",\n \"shimmer\",\n \"ship-wheel\",\n \"shipping-pallet\",\n \"shoe-ballet\",\n \"shoe-cleat\",\n \"shoe-formal\",\n \"shoe-heel\",\n \"shoe-print\",\n \"shoe-sneaker\",\n \"shopping\",\n \"shopping-music\",\n \"shopping-outline\",\n \"shopping-search\",\n \"shopping-search-outline\",\n \"shore\",\n \"shovel\",\n \"shovel-off\",\n \"shower\",\n \"shower-head\",\n \"shredder\",\n \"shuffle\",\n \"shuffle-disabled\",\n \"shuffle-variant\",\n \"shuriken\",\n \"sickle\",\n \"sigma\",\n \"sigma-lower\",\n \"sign-caution\",\n \"sign-direction\",\n \"sign-direction-minus\",\n \"sign-direction-plus\",\n \"sign-direction-remove\",\n \"sign-language\",\n \"sign-language-outline\",\n \"sign-pole\",\n \"sign-real-estate\",\n \"sign-text\",\n \"sign-yield\",\n \"signal\",\n \"signal-2g\",\n \"signal-3g\",\n \"signal-4g\",\n \"signal-5g\",\n \"signal-cellular-1\",\n \"signal-cellular-2\",\n \"signal-cellular-3\",\n \"signal-cellular-outline\",\n \"signal-distance-variant\",\n \"signal-hspa\",\n \"signal-hspa-plus\",\n \"signal-off\",\n \"signal-variant\",\n \"signature\",\n \"signature-freehand\",\n \"signature-image\",\n \"signature-text\",\n \"silo\",\n \"silo-outline\",\n \"silverware\",\n \"silverware-clean\",\n \"silverware-fork\",\n \"silverware-fork-knife\",\n \"silverware-spoon\",\n \"silverware-variant\",\n \"sim\",\n \"sim-alert\",\n \"sim-alert-outline\",\n \"sim-off\",\n \"sim-off-outline\",\n \"sim-outline\",\n \"simple-icons\",\n \"sina-weibo\",\n \"sine-wave\",\n \"sitemap\",\n \"sitemap-outline\",\n \"size-l\",\n \"size-m\",\n \"size-s\",\n \"size-xl\",\n \"size-xs\",\n \"size-xxl\",\n \"size-xxs\",\n \"size-xxxl\",\n \"skate\",\n \"skate-off\",\n \"skateboard\",\n \"skateboarding\",\n \"skew-less\",\n \"skew-more\",\n \"ski\",\n \"ski-cross-country\",\n \"ski-water\",\n \"skip-backward\",\n \"skip-backward-outline\",\n \"skip-forward\",\n \"skip-forward-outline\",\n \"skip-next\",\n \"skip-next-circle\",\n \"skip-next-circle-outline\",\n \"skip-next-outline\",\n \"skip-previous\",\n \"skip-previous-circle\",\n \"skip-previous-circle-outline\",\n \"skip-previous-outline\",\n \"skull\",\n \"skull-crossbones\",\n \"skull-crossbones-outline\",\n \"skull-outline\",\n \"skull-scan\",\n \"skull-scan-outline\",\n \"skype\",\n \"skype-business\",\n \"slack\",\n \"slash-forward\",\n \"slash-forward-box\",\n \"sledding\",\n \"sleep\",\n \"sleep-off\",\n \"slide\",\n \"slope-downhill\",\n \"slope-uphill\",\n \"slot-machine\",\n \"slot-machine-outline\",\n \"smart-card\",\n \"smart-card-off\",\n \"smart-card-off-outline\",\n \"smart-card-outline\",\n \"smart-card-reader\",\n \"smart-card-reader-outline\",\n \"smog\",\n \"smoke\",\n \"smoke-detector\",\n \"smoke-detector-alert\",\n \"smoke-detector-alert-outline\",\n \"smoke-detector-off\",\n \"smoke-detector-off-outline\",\n \"smoke-detector-outline\",\n \"smoke-detector-variant\",\n \"smoke-detector-variant-alert\",\n \"smoke-detector-variant-off\",\n \"smoking\",\n \"smoking-off\",\n \"smoking-pipe\",\n \"smoking-pipe-off\",\n \"snail\",\n \"snake\",\n \"snapchat\",\n \"snowboard\",\n \"snowflake\",\n \"snowflake-alert\",\n \"snowflake-check\",\n \"snowflake-melt\",\n \"snowflake-off\",\n \"snowflake-thermometer\",\n \"snowflake-variant\",\n \"snowman\",\n \"snowmobile\",\n \"snowshoeing\",\n \"soccer\",\n \"soccer-field\",\n \"social-distance-2-meters\",\n \"social-distance-6-feet\",\n \"sofa\",\n \"sofa-outline\",\n \"sofa-single\",\n \"sofa-single-outline\",\n \"solar-panel\",\n \"solar-panel-large\",\n \"solar-power\",\n \"solar-power-variant\",\n \"solar-power-variant-outline\",\n \"soldering-iron\",\n \"solid\",\n \"sony-playstation\",\n \"sort\",\n \"sort-alphabetical-ascending\",\n \"sort-alphabetical-ascending-variant\",\n \"sort-alphabetical-descending\",\n \"sort-alphabetical-descending-variant\",\n \"sort-alphabetical-variant\",\n \"sort-ascending\",\n \"sort-bool-ascending\",\n \"sort-bool-ascending-variant\",\n \"sort-bool-descending\",\n \"sort-bool-descending-variant\",\n \"sort-calendar-ascending\",\n \"sort-calendar-descending\",\n \"sort-clock-ascending\",\n \"sort-clock-ascending-outline\",\n \"sort-clock-descending\",\n \"sort-clock-descending-outline\",\n \"sort-descending\",\n \"sort-numeric-ascending\",\n \"sort-numeric-ascending-variant\",\n \"sort-numeric-descending\",\n \"sort-numeric-descending-variant\",\n \"sort-numeric-variant\",\n \"sort-reverse-variant\",\n \"sort-variant\",\n \"sort-variant-lock\",\n \"sort-variant-lock-open\",\n \"sort-variant-off\",\n \"sort-variant-remove\",\n \"soundbar\",\n \"soundcloud\",\n \"source-branch\",\n \"source-branch-check\",\n \"source-branch-minus\",\n \"source-branch-plus\",\n \"source-branch-refresh\",\n \"source-branch-remove\",\n \"source-branch-sync\",\n \"source-commit\",\n \"source-commit-end\",\n \"source-commit-end-local\",\n \"source-commit-local\",\n \"source-commit-next-local\",\n \"source-commit-start\",\n \"source-commit-start-next-local\",\n \"source-fork\",\n \"source-merge\",\n \"source-pull\",\n \"source-repository\",\n \"source-repository-multiple\",\n \"soy-sauce\",\n \"soy-sauce-off\",\n \"spa\",\n \"spa-outline\",\n \"space-invaders\",\n \"space-station\",\n \"spade\",\n \"speaker\",\n \"speaker-bluetooth\",\n \"speaker-message\",\n \"speaker-multiple\",\n \"speaker-off\",\n \"speaker-pause\",\n \"speaker-play\",\n \"speaker-stop\",\n \"speaker-wireless\",\n \"spear\",\n \"speedometer\",\n \"speedometer-medium\",\n \"speedometer-slow\",\n \"spellcheck\",\n \"sphere\",\n \"sphere-off\",\n \"spider\",\n \"spider-outline\",\n \"spider-thread\",\n \"spider-web\",\n \"spirit-level\",\n \"spoon-sugar\",\n \"spotify\",\n \"spotlight\",\n \"spotlight-beam\",\n \"spray\",\n \"spray-bottle\",\n \"sprinkler\",\n \"sprinkler-fire\",\n \"sprinkler-variant\",\n \"sprout\",\n \"sprout-outline\",\n \"square\",\n \"square-circle\",\n \"square-circle-outline\",\n \"square-edit-outline\",\n \"square-medium\",\n \"square-medium-outline\",\n \"square-off\",\n \"square-off-outline\",\n \"square-opacity\",\n \"square-outline\",\n \"square-root\",\n \"square-root-box\",\n \"square-rounded\",\n \"square-rounded-badge\",\n \"square-rounded-badge-outline\",\n \"square-rounded-outline\",\n \"square-small\",\n \"square-wave\",\n \"squeegee\",\n \"ssh\",\n \"stack-exchange\",\n \"stack-overflow\",\n \"stackpath\",\n \"stadium\",\n \"stadium-outline\",\n \"stadium-variant\",\n \"stairs\",\n \"stairs-box\",\n \"stairs-down\",\n \"stairs-up\",\n \"stamper\",\n \"standard-definition\",\n \"star\",\n \"star-box\",\n \"star-box-multiple\",\n \"star-box-multiple-outline\",\n \"star-box-outline\",\n \"star-check\",\n \"star-check-outline\",\n \"star-circle\",\n \"star-circle-outline\",\n \"star-cog\",\n \"star-cog-outline\",\n \"star-crescent\",\n \"star-david\",\n \"star-face\",\n \"star-four-points\",\n \"star-four-points-box\",\n \"star-four-points-box-outline\",\n \"star-four-points-circle\",\n \"star-four-points-circle-outline\",\n \"star-four-points-outline\",\n \"star-four-points-small\",\n \"star-half\",\n \"star-half-full\",\n \"star-minus\",\n \"star-minus-outline\",\n \"star-off\",\n \"star-off-outline\",\n \"star-outline\",\n \"star-plus\",\n \"star-plus-outline\",\n \"star-remove\",\n \"star-remove-outline\",\n \"star-settings\",\n \"star-settings-outline\",\n \"star-shooting\",\n \"star-shooting-outline\",\n \"star-three-points\",\n \"star-three-points-outline\",\n \"state-machine\",\n \"steam\",\n \"steering\",\n \"steering-off\",\n \"step-backward\",\n \"step-backward-2\",\n \"step-forward\",\n \"step-forward-2\",\n \"stethoscope\",\n \"sticker\",\n \"sticker-alert\",\n \"sticker-alert-outline\",\n \"sticker-check\",\n \"sticker-check-outline\",\n \"sticker-circle-outline\",\n \"sticker-emoji\",\n \"sticker-minus\",\n \"sticker-minus-outline\",\n \"sticker-outline\",\n \"sticker-plus\",\n \"sticker-plus-outline\",\n \"sticker-remove\",\n \"sticker-remove-outline\",\n \"sticker-text\",\n \"sticker-text-outline\",\n \"stocking\",\n \"stomach\",\n \"stool\",\n \"stool-outline\",\n \"stop\",\n \"stop-circle\",\n \"stop-circle-outline\",\n \"storage-tank\",\n \"storage-tank-outline\",\n \"store\",\n \"store-24-hour\",\n \"store-alert\",\n \"store-alert-outline\",\n \"store-check\",\n \"store-check-outline\",\n \"store-clock\",\n \"store-clock-outline\",\n \"store-cog\",\n \"store-cog-outline\",\n \"store-edit\",\n \"store-edit-outline\",\n \"store-marker\",\n \"store-marker-outline\",\n \"store-minus\",\n \"store-minus-outline\",\n \"store-off\",\n \"store-off-outline\",\n \"store-outline\",\n \"store-plus\",\n \"store-plus-outline\",\n \"store-remove\",\n \"store-remove-outline\",\n \"store-search\",\n \"store-search-outline\",\n \"store-settings\",\n \"store-settings-outline\",\n \"storefront\",\n \"storefront-check\",\n \"storefront-check-outline\",\n \"storefront-edit\",\n \"storefront-edit-outline\",\n \"storefront-minus\",\n \"storefront-minus-outline\",\n \"storefront-outline\",\n \"storefront-plus\",\n \"storefront-plus-outline\",\n \"storefront-remove\",\n \"storefront-remove-outline\",\n \"stove\",\n \"strategy\",\n \"stretch-to-page\",\n \"stretch-to-page-outline\",\n \"string-lights\",\n \"string-lights-off\",\n \"subdirectory-arrow-left\",\n \"subdirectory-arrow-right\",\n \"submarine\",\n \"subtitles\",\n \"subtitles-outline\",\n \"subway\",\n \"subway-alert-variant\",\n \"subway-variant\",\n \"summit\",\n \"sun-angle\",\n \"sun-angle-outline\",\n \"sun-clock\",\n \"sun-clock-outline\",\n \"sun-compass\",\n \"sun-snowflake\",\n \"sun-snowflake-variant\",\n \"sun-thermometer\",\n \"sun-thermometer-outline\",\n \"sun-wireless\",\n \"sun-wireless-outline\",\n \"sunglasses\",\n \"surfing\",\n \"surround-sound\",\n \"surround-sound-2-0\",\n \"surround-sound-2-1\",\n \"surround-sound-3-1\",\n \"surround-sound-5-1\",\n \"surround-sound-5-1-2\",\n \"surround-sound-7-1\",\n \"svg\",\n \"swap-horizontal\",\n \"swap-horizontal-bold\",\n \"swap-horizontal-circle\",\n \"swap-horizontal-circle-outline\",\n \"swap-horizontal-hidden\",\n \"swap-horizontal-variant\",\n \"swap-vertical\",\n \"swap-vertical-bold\",\n \"swap-vertical-circle\",\n \"swap-vertical-circle-outline\",\n \"swap-vertical-variant\",\n \"swim\",\n \"switch\",\n \"sword\",\n \"sword-cross\",\n \"syllabary-hangul\",\n \"syllabary-hiragana\",\n \"syllabary-katakana\",\n \"syllabary-katakana-halfwidth\",\n \"symbol\",\n \"symfony\",\n \"synagogue\",\n \"synagogue-outline\",\n \"sync\",\n \"sync-alert\",\n \"sync-circle\",\n \"sync-off\",\n \"tab\",\n \"tab-minus\",\n \"tab-plus\",\n \"tab-remove\",\n \"tab-search\",\n \"tab-unselected\",\n \"table\",\n \"table-account\",\n \"table-alert\",\n \"table-arrow-down\",\n \"table-arrow-left\",\n \"table-arrow-right\",\n \"table-arrow-up\",\n \"table-border\",\n \"table-cancel\",\n \"table-chair\",\n \"table-check\",\n \"table-clock\",\n \"table-cog\",\n \"table-column\",\n \"table-column-plus-after\",\n \"table-column-plus-before\",\n \"table-column-remove\",\n \"table-column-width\",\n \"table-edit\",\n \"table-eye\",\n \"table-eye-off\",\n \"table-filter\",\n \"table-furniture\",\n \"table-headers-eye\",\n \"table-headers-eye-off\",\n \"table-heart\",\n \"table-key\",\n \"table-large\",\n \"table-large-plus\",\n \"table-large-remove\",\n \"table-lock\",\n \"table-merge-cells\",\n \"table-minus\",\n \"table-multiple\",\n \"table-network\",\n \"table-of-contents\",\n \"table-off\",\n \"table-picnic\",\n \"table-pivot\",\n \"table-plus\",\n \"table-question\",\n \"table-refresh\",\n \"table-remove\",\n \"table-row\",\n \"table-row-height\",\n \"table-row-plus-after\",\n \"table-row-plus-before\",\n \"table-row-remove\",\n \"table-search\",\n \"table-settings\",\n \"table-split-cell\",\n \"table-star\",\n \"table-sync\",\n \"table-tennis\",\n \"tablet\",\n \"tablet-cellphone\",\n \"tablet-dashboard\",\n \"taco\",\n \"tag\",\n \"tag-arrow-down\",\n \"tag-arrow-down-outline\",\n \"tag-arrow-left\",\n \"tag-arrow-left-outline\",\n \"tag-arrow-right\",\n \"tag-arrow-right-outline\",\n \"tag-arrow-up\",\n \"tag-arrow-up-outline\",\n \"tag-check\",\n \"tag-check-outline\",\n \"tag-edit\",\n \"tag-edit-outline\",\n \"tag-faces\",\n \"tag-heart\",\n \"tag-heart-outline\",\n \"tag-hidden\",\n \"tag-minus\",\n \"tag-minus-outline\",\n \"tag-multiple\",\n \"tag-multiple-outline\",\n \"tag-off\",\n \"tag-off-outline\",\n \"tag-outline\",\n \"tag-plus\",\n \"tag-plus-outline\",\n \"tag-remove\",\n \"tag-remove-outline\",\n \"tag-search\",\n \"tag-search-outline\",\n \"tag-text\",\n \"tag-text-outline\",\n \"tailwind\",\n \"tally-mark-1\",\n \"tally-mark-2\",\n \"tally-mark-3\",\n \"tally-mark-4\",\n \"tally-mark-5\",\n \"tangram\",\n \"tank\",\n \"tanker-truck\",\n \"tape-drive\",\n \"tape-measure\",\n \"target\",\n \"target-account\",\n \"target-variant\",\n \"taxi\",\n \"tea\",\n \"tea-outline\",\n \"teamviewer\",\n \"teddy-bear\",\n \"telescope\",\n \"television\",\n \"television-ambient-light\",\n \"television-box\",\n \"television-classic\",\n \"television-classic-off\",\n \"television-guide\",\n \"television-off\",\n \"television-pause\",\n \"television-play\",\n \"television-shimmer\",\n \"television-speaker\",\n \"television-speaker-off\",\n \"television-stop\",\n \"temperature-celsius\",\n \"temperature-fahrenheit\",\n \"temperature-kelvin\",\n \"temple-buddhist\",\n \"temple-buddhist-outline\",\n \"temple-hindu\",\n \"temple-hindu-outline\",\n \"tennis\",\n \"tennis-ball\",\n \"tennis-ball-outline\",\n \"tent\",\n \"terraform\",\n \"terrain\",\n \"test-tube\",\n \"test-tube-empty\",\n \"test-tube-off\",\n \"text\",\n \"text-account\",\n \"text-box\",\n \"text-box-check\",\n \"text-box-check-outline\",\n \"text-box-edit\",\n \"text-box-edit-outline\",\n \"text-box-minus\",\n \"text-box-minus-outline\",\n \"text-box-multiple\",\n \"text-box-multiple-outline\",\n \"text-box-outline\",\n \"text-box-plus\",\n \"text-box-plus-outline\",\n \"text-box-remove\",\n \"text-box-remove-outline\",\n \"text-box-search\",\n \"text-box-search-outline\",\n \"text-long\",\n \"text-recognition\",\n \"text-search\",\n \"text-search-variant\",\n \"text-shadow\",\n \"text-short\",\n \"texture\",\n \"texture-box\",\n \"theater\",\n \"theme-light-dark\",\n \"thermometer\",\n \"thermometer-alert\",\n \"thermometer-auto\",\n \"thermometer-bluetooth\",\n \"thermometer-check\",\n \"thermometer-chevron-down\",\n \"thermometer-chevron-up\",\n \"thermometer-high\",\n \"thermometer-lines\",\n \"thermometer-low\",\n \"thermometer-minus\",\n \"thermometer-off\",\n \"thermometer-plus\",\n \"thermometer-probe\",\n \"thermometer-probe-off\",\n \"thermometer-water\",\n \"thermostat\",\n \"thermostat-auto\",\n \"thermostat-box\",\n \"thermostat-box-auto\",\n \"thermostat-cog\",\n \"thought-bubble\",\n \"thought-bubble-outline\",\n \"thumb-down\",\n \"thumb-down-outline\",\n \"thumb-up\",\n \"thumb-up-outline\",\n \"thumbs-up-down\",\n \"thumbs-up-down-outline\",\n \"ticket\",\n \"ticket-account\",\n \"ticket-confirmation\",\n \"ticket-confirmation-outline\",\n \"ticket-outline\",\n \"ticket-percent\",\n \"ticket-percent-outline\",\n \"tie\",\n \"tilde\",\n \"tilde-off\",\n \"timelapse\",\n \"timeline\",\n \"timeline-alert\",\n \"timeline-alert-outline\",\n \"timeline-check\",\n \"timeline-check-outline\",\n \"timeline-clock\",\n \"timeline-clock-outline\",\n \"timeline-minus\",\n \"timeline-minus-outline\",\n \"timeline-outline\",\n \"timeline-plus\",\n \"timeline-plus-outline\",\n \"timeline-question\",\n \"timeline-question-outline\",\n \"timeline-remove\",\n \"timeline-remove-outline\",\n \"timeline-text\",\n \"timeline-text-outline\",\n \"timer\",\n \"timer-10\",\n \"timer-3\",\n \"timer-alert\",\n \"timer-alert-outline\",\n \"timer-cancel\",\n \"timer-cancel-outline\",\n \"timer-check\",\n \"timer-check-outline\",\n \"timer-cog\",\n \"timer-cog-outline\",\n \"timer-edit\",\n \"timer-edit-outline\",\n \"timer-lock\",\n \"timer-lock-open\",\n \"timer-lock-open-outline\",\n \"timer-lock-outline\",\n \"timer-marker\",\n \"timer-marker-outline\",\n \"timer-minus\",\n \"timer-minus-outline\",\n \"timer-music\",\n \"timer-music-outline\",\n \"timer-off\",\n \"timer-off-outline\",\n \"timer-outline\",\n \"timer-pause\",\n \"timer-pause-outline\",\n \"timer-play\",\n \"timer-play-outline\",\n \"timer-plus\",\n \"timer-plus-outline\",\n \"timer-refresh\",\n \"timer-refresh-outline\",\n \"timer-remove\",\n \"timer-remove-outline\",\n \"timer-sand\",\n \"timer-sand-complete\",\n \"timer-sand-empty\",\n \"timer-sand-full\",\n \"timer-sand-paused\",\n \"timer-settings\",\n \"timer-settings-outline\",\n \"timer-star\",\n \"timer-star-outline\",\n \"timer-stop\",\n \"timer-stop-outline\",\n \"timer-sync\",\n \"timer-sync-outline\",\n \"timetable\",\n \"tire\",\n \"toaster\",\n \"toaster-off\",\n \"toaster-oven\",\n \"toggle-switch\",\n \"toggle-switch-off\",\n \"toggle-switch-off-outline\",\n \"toggle-switch-outline\",\n \"toggle-switch-variant\",\n \"toggle-switch-variant-off\",\n \"toilet\",\n \"toolbox\",\n \"toolbox-outline\",\n \"tools\",\n \"tooltip\",\n \"tooltip-account\",\n \"tooltip-cellphone\",\n \"tooltip-check\",\n \"tooltip-check-outline\",\n \"tooltip-edit\",\n \"tooltip-edit-outline\",\n \"tooltip-image\",\n \"tooltip-image-outline\",\n \"tooltip-minus\",\n \"tooltip-minus-outline\",\n \"tooltip-outline\",\n \"tooltip-plus\",\n \"tooltip-plus-outline\",\n \"tooltip-question\",\n \"tooltip-question-outline\",\n \"tooltip-remove\",\n \"tooltip-remove-outline\",\n \"tooltip-text\",\n \"tooltip-text-outline\",\n \"tooth\",\n \"tooth-outline\",\n \"toothbrush\",\n \"toothbrush-electric\",\n \"toothbrush-paste\",\n \"torch\",\n \"tortoise\",\n \"toslink\",\n \"touch-text-outline\",\n \"tournament\",\n \"tow-truck\",\n \"tower-beach\",\n \"tower-fire\",\n \"town-hall\",\n \"toy-brick\",\n \"toy-brick-marker\",\n \"toy-brick-marker-outline\",\n \"toy-brick-minus\",\n \"toy-brick-minus-outline\",\n \"toy-brick-outline\",\n \"toy-brick-plus\",\n \"toy-brick-plus-outline\",\n \"toy-brick-remove\",\n \"toy-brick-remove-outline\",\n \"toy-brick-search\",\n \"toy-brick-search-outline\",\n \"track-light\",\n \"track-light-off\",\n \"trackpad\",\n \"trackpad-lock\",\n \"tractor\",\n \"tractor-variant\",\n \"trademark\",\n \"traffic-cone\",\n \"traffic-light\",\n \"traffic-light-outline\",\n \"train\",\n \"train-bus\",\n \"train-car\",\n \"train-car-autorack\",\n \"train-car-box\",\n \"train-car-box-full\",\n \"train-car-box-open\",\n \"train-car-caboose\",\n \"train-car-centerbeam\",\n \"train-car-centerbeam-full\",\n \"train-car-container\",\n \"train-car-flatbed\",\n \"train-car-flatbed-car\",\n \"train-car-flatbed-tank\",\n \"train-car-gondola\",\n \"train-car-gondola-full\",\n \"train-car-hopper\",\n \"train-car-hopper-covered\",\n \"train-car-hopper-full\",\n \"train-car-intermodal\",\n \"train-car-passenger\",\n \"train-car-passenger-door\",\n \"train-car-passenger-door-open\",\n \"train-car-passenger-variant\",\n \"train-car-tank\",\n \"train-variant\",\n \"tram\",\n \"tram-side\",\n \"transcribe\",\n \"transcribe-close\",\n \"transfer\",\n \"transfer-down\",\n \"transfer-left\",\n \"transfer-right\",\n \"transfer-up\",\n \"transit-connection\",\n \"transit-connection-horizontal\",\n \"transit-connection-variant\",\n \"transit-detour\",\n \"transit-skip\",\n \"transit-transfer\",\n \"transition\",\n \"transition-masked\",\n \"translate\",\n \"translate-off\",\n \"translate-variant\",\n \"transmission-tower\",\n \"transmission-tower-export\",\n \"transmission-tower-import\",\n \"transmission-tower-off\",\n \"trash-can\",\n \"trash-can-outline\",\n \"tray\",\n \"tray-alert\",\n \"tray-arrow-down\",\n \"tray-arrow-up\",\n \"tray-full\",\n \"tray-minus\",\n \"tray-plus\",\n \"tray-remove\",\n \"treasure-chest\",\n \"treasure-chest-outline\",\n \"tree\",\n \"tree-outline\",\n \"trello\",\n \"trending-down\",\n \"trending-neutral\",\n \"trending-up\",\n \"triangle\",\n \"triangle-down\",\n \"triangle-down-outline\",\n \"triangle-outline\",\n \"triangle-small-down\",\n \"triangle-small-up\",\n \"triangle-wave\",\n \"triforce\",\n \"trophy\",\n \"trophy-award\",\n \"trophy-broken\",\n \"trophy-outline\",\n \"trophy-variant\",\n \"trophy-variant-outline\",\n \"truck\",\n \"truck-alert\",\n \"truck-alert-outline\",\n \"truck-cargo-container\",\n \"truck-check\",\n \"truck-check-outline\",\n \"truck-delivery\",\n \"truck-delivery-outline\",\n \"truck-fast\",\n \"truck-fast-outline\",\n \"truck-flatbed\",\n \"truck-minus\",\n \"truck-minus-outline\",\n \"truck-off-road\",\n \"truck-off-road-off\",\n \"truck-outline\",\n \"truck-plus\",\n \"truck-plus-outline\",\n \"truck-remove\",\n \"truck-remove-outline\",\n \"truck-snowflake\",\n \"truck-trailer\",\n \"trumpet\",\n \"tshirt-crew\",\n \"tshirt-crew-outline\",\n \"tshirt-v\",\n \"tshirt-v-outline\",\n \"tsunami\",\n \"tumble-dryer\",\n \"tumble-dryer-alert\",\n \"tumble-dryer-off\",\n \"tune\",\n \"tune-variant\",\n \"tune-vertical\",\n \"tune-vertical-variant\",\n \"tunnel\",\n \"tunnel-outline\",\n \"turbine\",\n \"turkey\",\n \"turnstile\",\n \"turnstile-outline\",\n \"turtle\",\n \"twitch\",\n \"twitter\",\n \"two-factor-authentication\",\n \"typewriter\",\n \"ubisoft\",\n \"ubuntu\",\n \"ufo\",\n \"ufo-outline\",\n \"ultra-high-definition\",\n \"umbraco\",\n \"umbrella\",\n \"umbrella-beach\",\n \"umbrella-beach-outline\",\n \"umbrella-closed\",\n \"umbrella-closed-outline\",\n \"umbrella-closed-variant\",\n \"umbrella-outline\",\n \"underwear-outline\",\n \"undo\",\n \"undo-variant\",\n \"unfold-less-horizontal\",\n \"unfold-less-vertical\",\n \"unfold-more-horizontal\",\n \"unfold-more-vertical\",\n \"ungroup\",\n \"unicode\",\n \"unicorn\",\n \"unicorn-variant\",\n \"unicycle\",\n \"unity\",\n \"unreal\",\n \"update\",\n \"upload\",\n \"upload-box\",\n \"upload-box-outline\",\n \"upload-circle\",\n \"upload-circle-outline\",\n \"upload-lock\",\n \"upload-lock-outline\",\n \"upload-multiple\",\n \"upload-multiple-outline\",\n \"upload-network\",\n \"upload-network-outline\",\n \"upload-off\",\n \"upload-off-outline\",\n \"upload-outline\",\n \"usb\",\n \"usb-c-port\",\n \"usb-flash-drive\",\n \"usb-flash-drive-outline\",\n \"usb-port\",\n \"vacuum\",\n \"vacuum-outline\",\n \"valve\",\n \"valve-closed\",\n \"valve-open\",\n \"van-passenger\",\n \"van-utility\",\n \"vanish\",\n \"vanish-quarter\",\n \"vanity-light\",\n \"variable\",\n \"variable-box\",\n \"vector-arrange-above\",\n \"vector-arrange-below\",\n \"vector-bezier\",\n \"vector-circle\",\n \"vector-circle-variant\",\n \"vector-combine\",\n \"vector-curve\",\n \"vector-difference\",\n \"vector-difference-ab\",\n \"vector-difference-ba\",\n \"vector-ellipse\",\n \"vector-intersection\",\n \"vector-line\",\n \"vector-link\",\n \"vector-point\",\n \"vector-point-edit\",\n \"vector-point-minus\",\n \"vector-point-plus\",\n \"vector-point-select\",\n \"vector-polygon\",\n \"vector-polygon-variant\",\n \"vector-polyline\",\n \"vector-polyline-edit\",\n \"vector-polyline-minus\",\n \"vector-polyline-plus\",\n \"vector-polyline-remove\",\n \"vector-radius\",\n \"vector-rectangle\",\n \"vector-selection\",\n \"vector-square\",\n \"vector-square-close\",\n \"vector-square-edit\",\n \"vector-square-minus\",\n \"vector-square-open\",\n \"vector-square-plus\",\n \"vector-square-remove\",\n \"vector-triangle\",\n \"vector-union\",\n \"vhs\",\n \"vibrate\",\n \"vibrate-off\",\n \"video\",\n \"video-2d\",\n \"video-3d\",\n \"video-3d-off\",\n \"video-3d-variant\",\n \"video-4k-box\",\n \"video-account\",\n \"video-box\",\n \"video-box-off\",\n \"video-check\",\n \"video-check-outline\",\n \"video-high-definition\",\n \"video-image\",\n \"video-input-antenna\",\n \"video-input-component\",\n \"video-input-hdmi\",\n \"video-input-scart\",\n \"video-input-svideo\",\n \"video-marker\",\n \"video-marker-outline\",\n \"video-minus\",\n \"video-minus-outline\",\n \"video-off\",\n \"video-off-outline\",\n \"video-outline\",\n \"video-plus\",\n \"video-plus-outline\",\n \"video-stabilization\",\n \"video-standard-definition\",\n \"video-switch\",\n \"video-switch-outline\",\n \"video-vintage\",\n \"video-wireless\",\n \"video-wireless-outline\",\n \"view-agenda\",\n \"view-agenda-outline\",\n \"view-array\",\n \"view-array-outline\",\n \"view-carousel\",\n \"view-carousel-outline\",\n \"view-column\",\n \"view-column-outline\",\n \"view-comfy\",\n \"view-comfy-outline\",\n \"view-compact\",\n \"view-compact-outline\",\n \"view-dashboard\",\n \"view-dashboard-edit\",\n \"view-dashboard-edit-outline\",\n \"view-dashboard-outline\",\n \"view-dashboard-variant\",\n \"view-dashboard-variant-outline\",\n \"view-day\",\n \"view-day-outline\",\n \"view-gallery\",\n \"view-gallery-outline\",\n \"view-grid\",\n \"view-grid-compact\",\n \"view-grid-outline\",\n \"view-grid-plus\",\n \"view-grid-plus-outline\",\n \"view-headline\",\n \"view-list\",\n \"view-list-outline\",\n \"view-module\",\n \"view-module-outline\",\n \"view-parallel\",\n \"view-parallel-outline\",\n \"view-quilt\",\n \"view-quilt-outline\",\n \"view-sequential\",\n \"view-sequential-outline\",\n \"view-split-horizontal\",\n \"view-split-vertical\",\n \"view-stream\",\n \"view-stream-outline\",\n \"view-week\",\n \"view-week-outline\",\n \"vimeo\",\n \"violin\",\n \"virtual-reality\",\n \"virus\",\n \"virus-off\",\n \"virus-off-outline\",\n \"virus-outline\",\n \"vlc\",\n \"voicemail\",\n \"volcano\",\n \"volcano-outline\",\n \"volleyball\",\n \"volume-equal\",\n \"volume-high\",\n \"volume-low\",\n \"volume-medium\",\n \"volume-minus\",\n \"volume-mute\",\n \"volume-off\",\n \"volume-plus\",\n \"volume-source\",\n \"volume-variant-off\",\n \"volume-vibrate\",\n \"vote\",\n \"vote-outline\",\n \"vpn\",\n \"vuejs\",\n \"vuetify\",\n \"walk\",\n \"wall\",\n \"wall-fire\",\n \"wall-sconce\",\n \"wall-sconce-flat\",\n \"wall-sconce-flat-outline\",\n \"wall-sconce-flat-variant\",\n \"wall-sconce-flat-variant-outline\",\n \"wall-sconce-outline\",\n \"wall-sconce-round\",\n \"wall-sconce-round-outline\",\n \"wall-sconce-round-variant\",\n \"wall-sconce-round-variant-outline\",\n \"wallet\",\n \"wallet-bifold\",\n \"wallet-bifold-outline\",\n \"wallet-giftcard\",\n \"wallet-membership\",\n \"wallet-outline\",\n \"wallet-plus\",\n \"wallet-plus-outline\",\n \"wallet-travel\",\n \"wallpaper\",\n \"wan\",\n \"wardrobe\",\n \"wardrobe-outline\",\n \"warehouse\",\n \"washing-machine\",\n \"washing-machine-alert\",\n \"washing-machine-off\",\n \"watch\",\n \"watch-export\",\n \"watch-export-variant\",\n \"watch-import\",\n \"watch-import-variant\",\n \"watch-variant\",\n \"watch-vibrate\",\n \"watch-vibrate-off\",\n \"water\",\n \"water-alert\",\n \"water-alert-outline\",\n \"water-boiler\",\n \"water-boiler-alert\",\n \"water-boiler-auto\",\n \"water-boiler-off\",\n \"water-check\",\n \"water-check-outline\",\n \"water-circle\",\n \"water-minus\",\n \"water-minus-outline\",\n \"water-off\",\n \"water-off-outline\",\n \"water-opacity\",\n \"water-outline\",\n \"water-percent\",\n \"water-percent-alert\",\n \"water-plus\",\n \"water-plus-outline\",\n \"water-polo\",\n \"water-pump\",\n \"water-pump-off\",\n \"water-remove\",\n \"water-remove-outline\",\n \"water-sync\",\n \"water-thermometer\",\n \"water-thermometer-outline\",\n \"water-well\",\n \"water-well-outline\",\n \"waterfall\",\n \"watering-can\",\n \"watering-can-outline\",\n \"watermark\",\n \"wave\",\n \"wave-arrow-down\",\n \"wave-arrow-up\",\n \"wave-undercurrent\",\n \"waveform\",\n \"waves\",\n \"waves-arrow-left\",\n \"waves-arrow-right\",\n \"waves-arrow-up\",\n \"waze\",\n \"weather-cloudy\",\n \"weather-cloudy-alert\",\n \"weather-cloudy-arrow-right\",\n \"weather-cloudy-clock\",\n \"weather-dust\",\n \"weather-fog\",\n \"weather-hail\",\n \"weather-hazy\",\n \"weather-hurricane\",\n \"weather-hurricane-outline\",\n \"weather-lightning\",\n \"weather-lightning-rainy\",\n \"weather-moonset\",\n \"weather-moonset-down\",\n \"weather-moonset-up\",\n \"weather-night\",\n \"weather-night-partly-cloudy\",\n \"weather-partly-cloudy\",\n \"weather-partly-lightning\",\n \"weather-partly-rainy\",\n \"weather-partly-snowy\",\n \"weather-partly-snowy-rainy\",\n \"weather-pouring\",\n \"weather-rainy\",\n \"weather-snowy\",\n \"weather-snowy-heavy\",\n \"weather-snowy-rainy\",\n \"weather-sunny\",\n \"weather-sunny-alert\",\n \"weather-sunny-off\",\n \"weather-sunset\",\n \"weather-sunset-down\",\n \"weather-sunset-up\",\n \"weather-tornado\",\n \"weather-windy\",\n \"weather-windy-variant\",\n \"web\",\n \"web-box\",\n \"web-cancel\",\n \"web-check\",\n \"web-clock\",\n \"web-minus\",\n \"web-off\",\n \"web-plus\",\n \"web-refresh\",\n \"web-remove\",\n \"web-sync\",\n \"webcam\",\n \"webcam-off\",\n \"webhook\",\n \"webpack\",\n \"webrtc\",\n \"wechat\",\n \"weight\",\n \"weight-gram\",\n \"weight-kilogram\",\n \"weight-lifter\",\n \"weight-pound\",\n \"whatsapp\",\n \"wheel-barrow\",\n \"wheelchair\",\n \"wheelchair-accessibility\",\n \"whistle\",\n \"whistle-outline\",\n \"white-balance-auto\",\n \"white-balance-incandescent\",\n \"white-balance-iridescent\",\n \"white-balance-sunny\",\n \"widgets\",\n \"widgets-outline\",\n \"wifi\",\n \"wifi-alert\",\n \"wifi-arrow-down\",\n \"wifi-arrow-left\",\n \"wifi-arrow-left-right\",\n \"wifi-arrow-right\",\n \"wifi-arrow-up\",\n \"wifi-arrow-up-down\",\n \"wifi-cancel\",\n \"wifi-check\",\n \"wifi-cog\",\n \"wifi-lock\",\n \"wifi-lock-open\",\n \"wifi-marker\",\n \"wifi-minus\",\n \"wifi-off\",\n \"wifi-plus\",\n \"wifi-refresh\",\n \"wifi-remove\",\n \"wifi-settings\",\n \"wifi-star\",\n \"wifi-strength-1\",\n \"wifi-strength-1-alert\",\n \"wifi-strength-1-lock\",\n \"wifi-strength-1-lock-open\",\n \"wifi-strength-2\",\n \"wifi-strength-2-alert\",\n \"wifi-strength-2-lock\",\n \"wifi-strength-2-lock-open\",\n \"wifi-strength-3\",\n \"wifi-strength-3-alert\",\n \"wifi-strength-3-lock\",\n \"wifi-strength-3-lock-open\",\n \"wifi-strength-4\",\n \"wifi-strength-4-alert\",\n \"wifi-strength-4-lock\",\n \"wifi-strength-4-lock-open\",\n \"wifi-strength-alert-outline\",\n \"wifi-strength-lock-open-outline\",\n \"wifi-strength-lock-outline\",\n \"wifi-strength-off\",\n \"wifi-strength-off-outline\",\n \"wifi-strength-outline\",\n \"wifi-sync\",\n \"wikipedia\",\n \"wind-power\",\n \"wind-power-outline\",\n \"wind-turbine\",\n \"wind-turbine-alert\",\n \"wind-turbine-check\",\n \"window-close\",\n \"window-closed\",\n \"window-closed-variant\",\n \"window-maximize\",\n \"window-minimize\",\n \"window-open\",\n \"window-open-variant\",\n \"window-restore\",\n \"window-shutter\",\n \"window-shutter-alert\",\n \"window-shutter-auto\",\n \"window-shutter-cog\",\n \"window-shutter-open\",\n \"window-shutter-settings\",\n \"windsock\",\n \"wiper\",\n \"wiper-wash\",\n \"wiper-wash-alert\",\n \"wizard-hat\",\n \"wordpress\",\n \"wrap\",\n \"wrap-disabled\",\n \"wrench\",\n \"wrench-check\",\n \"wrench-check-outline\",\n \"wrench-clock\",\n \"wrench-clock-outline\",\n \"wrench-cog\",\n \"wrench-cog-outline\",\n \"wrench-outline\",\n \"xamarin\",\n \"xml\",\n \"xmpp\",\n \"yahoo\",\n \"yeast\",\n \"yin-yang\",\n \"yoga\",\n \"youtube\",\n \"youtube-gaming\",\n \"youtube-studio\",\n \"youtube-subscription\",\n \"youtube-tv\",\n \"yurt\",\n \"z-wave\",\n \"zend\",\n \"zigbee\",\n \"zip-box\",\n \"zip-box-outline\",\n \"zip-disk\",\n \"zodiac-aquarius\",\n \"zodiac-aries\",\n \"zodiac-cancer\",\n \"zodiac-capricorn\",\n \"zodiac-gemini\",\n \"zodiac-leo\",\n \"zodiac-libra\",\n \"zodiac-pisces\",\n \"zodiac-sagittarius\",\n \"zodiac-scorpio\",\n \"zodiac-taurus\",\n \"zodiac-virgo\"\n ]\n}","/**\n * Get Types Tool\n *\n * Returns TypeScript type definitions for Idealyst components, theme, and navigation.\n * Enhanced with @idealyst/tooling registry data for authoritative prop values.\n *\n * Types are generated dynamically at runtime using @idealyst/tooling if the\n * pre-generated types.json file is not found.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { analyzeComponents, analyzeTheme } from '@idealyst/tooling';\nimport type { ComponentRegistry, ThemeValues } from '@idealyst/tooling';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ninterface TypesData {\n version: string;\n extractedAt: string;\n components: Record<string, any>;\n theme: Record<string, any>;\n navigation: Record<string, any>;\n // Registry data from @idealyst/tooling (single source of truth)\n registry?: {\n components: Record<string, any>;\n themeValues: any;\n };\n}\n\nlet cachedTypes: TypesData | null = null;\n\n/**\n * Find the monorepo root by looking for package.json with workspaces\n */\nfunction findMonorepoRoot(): string | null {\n // Start from the mcp-server package location\n let currentDir = path.resolve(__dirname, '../..');\n\n // Walk up looking for the monorepo root (has workspaces in package.json)\n for (let i = 0; i < 10; i++) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.workspaces) {\n return currentDir;\n }\n } catch {\n // Continue searching\n }\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Find package paths - works with both symlinked monorepo and installed packages\n */\nfunction findPackagePaths(): { componentsPath: string; themePath: string } | null {\n // First try: resolve via node_modules (works for symlinked monorepo)\n try {\n const componentsEntry = require.resolve('@idealyst/components');\n const themeEntry = require.resolve('@idealyst/theme');\n\n // Get the src directories\n const componentsPath = path.join(path.dirname(componentsEntry), '..', 'src');\n const themePath = path.join(path.dirname(themeEntry), '..', 'src', 'lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n } catch {\n // Not found via require.resolve\n }\n\n // Second try: look for monorepo structure\n const monorepoRoot = findMonorepoRoot();\n if (monorepoRoot) {\n const componentsPath = path.join(monorepoRoot, 'packages/components/src');\n const themePath = path.join(monorepoRoot, 'packages/theme/src/lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n }\n\n return null;\n}\n\n/**\n * Generate types dynamically using @idealyst/tooling\n */\nfunction generateTypes(): TypesData {\n const paths = findPackagePaths();\n\n if (!paths) {\n throw new Error(\n 'Could not find @idealyst/components and @idealyst/theme packages. ' +\n 'Ensure you are running in the Idealyst monorepo or have the packages installed.'\n );\n }\n\n const { componentsPath, themePath } = paths;\n\n // Analyze components using @idealyst/tooling\n let componentRegistry: ComponentRegistry = {};\n let themeValues: ThemeValues | null = null;\n\n try {\n componentRegistry = analyzeComponents({\n componentPaths: [componentsPath],\n themePath,\n });\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze components:', error);\n }\n\n try {\n themeValues = analyzeTheme(themePath, false);\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze theme:', error);\n }\n\n // Convert component registry to the expected format\n const components: Record<string, any> = {};\n for (const [name, def] of Object.entries(componentRegistry)) {\n components[name] = {\n propsInterface: `${name}Props`,\n props: Object.entries(def.props).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n description: prop.description,\n values: prop.values,\n default: prop.default,\n })),\n typeDefinition: '', // Not available without ts-morph\n relatedTypes: {},\n registry: def,\n };\n }\n\n // Build theme types from themeValues\n const theme: Record<string, any> = {};\n if (themeValues) {\n theme.Intent = {\n name: 'Intent',\n definition: `type Intent = ${themeValues.intents.map((i) => `'${i}'`).join(' | ')};`,\n values: themeValues.intents,\n };\n\n // Extract size keys from the first size group\n const sizeKeys = Object.keys(themeValues.sizes)[0]\n ? Object.keys(themeValues.sizes[Object.keys(themeValues.sizes)[0]])\n : ['xs', 'sm', 'md', 'lg', 'xl'];\n theme.Size = {\n name: 'Size',\n definition: `type Size = ${sizeKeys.map((s) => `'${s}'`).join(' | ')};`,\n values: sizeKeys,\n };\n }\n\n return {\n version: 'dynamic',\n extractedAt: new Date().toISOString(),\n components,\n theme,\n navigation: {}, // Navigation types require ts-morph, not available dynamically\n registry: {\n components: componentRegistry,\n themeValues,\n },\n };\n}\n\n/**\n * Load types from JSON file or generate dynamically\n */\nfunction loadTypes(): TypesData {\n if (cachedTypes) {\n return cachedTypes;\n }\n\n // Try to load pre-generated types first\n const typesPath = path.join(__dirname, '../generated/types.json');\n\n if (fs.existsSync(typesPath)) {\n try {\n const content = fs.readFileSync(typesPath, 'utf-8');\n cachedTypes = JSON.parse(content);\n return cachedTypes!;\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not parse types.json, generating dynamically');\n }\n }\n\n // Generate types dynamically\n cachedTypes = generateTypes();\n return cachedTypes;\n}\n\n/**\n * Find the canonical component name from types data (case-insensitive)\n */\nfunction findComponentNameInTypes(types: TypesData, componentName: string): string | undefined {\n // Direct match first (fast path)\n if (types.components[componentName]) {\n return componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n return Object.keys(types.components).find(\n (name) => name.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get component types by name (case-insensitive)\n */\nexport function getComponentTypes(componentName: string, format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n const canonicalName = findComponentNameInTypes(types, componentName);\n\n if (!canonicalName) {\n throw new Error(\n `Component \"${componentName}\" not found. Available components: ${Object.keys(types.components).join(', ')}`\n );\n }\n\n const component = types.components[canonicalName];\n\n const result: any = {\n component: canonicalName,\n };\n\n if (format === 'typescript' || format === 'both') {\n result.typescript = formatTypeScriptOutput(component);\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = {\n propsInterface: component.propsInterface,\n props: component.props,\n relatedTypes: component.relatedTypes,\n };\n\n // Include registry data if available (authoritative prop values)\n if (component.registry) {\n result.registry = component.registry;\n }\n }\n\n return result;\n}\n\n/**\n * Get theme types\n */\nexport function getThemeTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Theme Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.theme)\n .map(([_, info]: [string, any]) => info.definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.theme;\n\n // Include authoritative theme values from registry if available\n if (types.registry?.themeValues) {\n result.themeValues = types.registry.themeValues;\n }\n }\n\n return result;\n}\n\n/**\n * Get navigation types\n */\nexport function getNavigationTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Navigation Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.navigation)\n .map(([_, definition]) => definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.navigation;\n }\n\n return result;\n}\n\n/**\n * Format TypeScript output for better readability\n */\nfunction formatTypeScriptOutput(component: any): string {\n const sections: string[] = [];\n\n // Main props interface\n sections.push(`// ${component.propsInterface}`);\n sections.push(component.typeDefinition);\n\n // Related types\n if (Object.keys(component.relatedTypes).length > 0) {\n sections.push('\\n// Related Types');\n for (const [_, definition] of Object.entries(component.relatedTypes)) {\n sections.push(definition as string);\n }\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get list of all available components\n */\nexport function getAvailableComponents() {\n const types = loadTypes();\n return Object.keys(types.components);\n}\n\n/**\n * Find the correct example file name (case-insensitive)\n */\nfunction findExampleFile(componentName: string): string | null {\n const examplesDir = path.join(__dirname, '../../examples/components');\n\n // Direct match first (fast path)\n const directPath = path.join(examplesDir, `${componentName}.examples.tsx`);\n if (fs.existsSync(directPath)) {\n return directPath;\n }\n\n // Case-insensitive lookup\n if (!fs.existsSync(examplesDir)) {\n return null;\n }\n\n const lowerName = componentName.toLowerCase();\n const files = fs.readdirSync(examplesDir);\n const match = files.find(\n (file) => file.toLowerCase() === `${lowerName}.examples.tsx`\n );\n\n return match ? path.join(examplesDir, match) : null;\n}\n\n/**\n * Get examples for a component (case-insensitive)\n */\nexport function getComponentExamples(componentName: string): string | null {\n const examplesPath = findExampleFile(componentName);\n\n if (!examplesPath) {\n return null;\n }\n\n return fs.readFileSync(examplesPath, 'utf-8');\n}\n\n/**\n * Get the full component registry from @idealyst/tooling\n * This is the single source of truth for component props and values\n */\nexport function getComponentRegistry() {\n const types = loadTypes();\n return types.registry?.components || {};\n}\n\n/**\n * Get theme values from the registry\n * This is the single source of truth for available intents, sizes, etc.\n */\nexport function getRegistryThemeValues() {\n const types = loadTypes();\n return types.registry?.themeValues || null;\n}\n","/**\n * Tool Handlers\n *\n * Implementation functions for all MCP tools.\n * These handlers can be used directly or through an MCP server.\n *\n * Component documentation now uses:\n * - Types: Dynamically loaded from @idealyst/tooling via generated/types.json\n * - Examples: Type-checked .examples.tsx files in examples/components/\n * - Metadata: Minimal static metadata (category, description, features, best practices)\n */\n\nimport {\n componentMetadata,\n getComponentMetadata,\n getComponentNames,\n searchComponents as searchComponentsData,\n getComponentsByCategory,\n findComponentName,\n} from \"../data/component-metadata.js\";\nimport { cliCommands } from \"../data/cli-commands.js\";\nimport { translateGuides } from \"../data/translate-guides.js\";\nimport { storageGuides } from \"../data/storage-guides.js\";\nimport {\n packages,\n getPackageSummary,\n getPackagesByCategory as getPackagesByCat,\n searchPackages as searchPackagesData,\n} from \"../data/packages.js\";\nimport {\n recipes,\n getRecipeSummary,\n getRecipesByCategory,\n searchRecipes as searchRecipesData,\n} from \"../data/recipes.js\";\nimport {\n installGuides,\n getInstallGuide as getInstallGuideData,\n formatInstallGuideMarkdown,\n} from \"../data/install-guides.js\";\nimport iconsData from \"../data/icons.json\" with { type: \"json\" };\nimport {\n getComponentTypes as getTypesFromFile,\n getThemeTypes as getThemeTypesFromFile,\n getNavigationTypes as getNavigationTypesFromFile,\n getAvailableComponents,\n getComponentExamples as getComponentExamplesFromFile,\n} from \"./get-types.js\";\nimport type {\n ToolResponse,\n ListComponentsArgs,\n GetComponentDocsArgs,\n GetComponentExampleArgs,\n SearchComponentsArgs,\n GetComponentTypesArgs,\n GetComponentExamplesTsArgs,\n GetCliUsageArgs,\n SearchIconsArgs,\n GetThemeTypesArgs,\n GetNavigationTypesArgs,\n GetTranslateGuideArgs,\n GetStorageGuideArgs,\n ListPackagesArgs,\n GetPackageDocsArgs,\n SearchPackagesArgs,\n ListRecipesArgs,\n GetRecipeArgs,\n SearchRecipesArgs,\n GetInstallGuideArgs,\n} from \"./types.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a standard tool response with text content\n */\nfunction textResponse(text: string): ToolResponse {\n return {\n content: [{ type: \"text\", text }],\n };\n}\n\n/**\n * Create a JSON response\n */\nfunction jsonResponse(data: unknown): ToolResponse {\n return textResponse(JSON.stringify(data, null, 2));\n}\n\n// ============================================================================\n// Component Tool Handlers\n// ============================================================================\n\n/**\n * List all available Idealyst components with brief descriptions\n */\nexport function listComponents(_args: ListComponentsArgs = {}): ToolResponse {\n const componentList = getComponentNames().map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(componentList);\n}\n\n/**\n * Get detailed documentation for a specific component\n *\n * Returns:\n * - Description and category from metadata\n * - TypeScript props from dynamic types\n * - Features and best practices from metadata\n * - Type-checked examples from .examples.tsx files\n */\nexport function getComponentDocs(args: GetComponentDocsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(\n `Component \"${inputName}\" not found. Available components: ${getComponentNames().join(\", \")}`\n );\n }\n\n const meta = getComponentMetadata(canonicalName)!;\n\n // Get TypeScript types for props documentation\n let propsSection = \"\";\n try {\n const types = getTypesFromFile(canonicalName, \"typescript\");\n propsSection = `## Props (TypeScript)\n\n\\`\\`\\`typescript\n${types.typescript}\n\\`\\`\\``;\n } catch {\n propsSection = \"## Props\\n\\n_Types not available. Run `yarn extract-types` to generate._\";\n }\n\n // Get type-checked examples\n let examplesSection = \"\";\n const examples = getComponentExamplesFromFile(canonicalName);\n if (examples) {\n examplesSection = `## Examples\n\n\\`\\`\\`tsx\n${examples}\n\\`\\`\\``;\n }\n\n const docs = `# ${canonicalName}\n\n${meta.description}\n\n## Category\n${meta.category}\n\n${propsSection}\n\n## Features\n${meta.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n## Best Practices\n${meta.bestPractices.map((bp) => `- ${bp}`).join(\"\\n\")}\n\n${examplesSection}\n`;\n\n return textResponse(docs);\n}\n\n/**\n * Get a code example for a specific component\n *\n * Returns the type-checked example file content.\n * The example_type parameter is kept for API compatibility but all examples\n * are now in a single .examples.tsx file.\n */\nexport function getComponentExample(args: GetComponentExampleArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(`Component \"${inputName}\" not found.`);\n }\n\n const examples = getComponentExamplesFromFile(canonicalName);\n if (!examples) {\n return textResponse(\n `No examples found for \"${canonicalName}\". Examples are in packages/mcp-server/examples/components/${canonicalName}.examples.tsx`\n );\n }\n\n return textResponse(examples);\n}\n\n/**\n * Search for components by name, category, or feature\n */\nexport function searchComponents(args: SearchComponentsArgs = {}): ToolResponse {\n const query = args.query || \"\";\n const category = args.category;\n\n let results: string[];\n\n if (query) {\n results = searchComponentsData(query, category);\n } else if (category) {\n results = getComponentsByCategory(category);\n } else {\n results = getComponentNames();\n }\n\n const resultList = results.map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(resultList);\n}\n\n/**\n * Get TypeScript type definitions for a component\n */\nexport function getComponentTypes(args: GetComponentTypesArgs): ToolResponse {\n const componentName = args.component;\n const format = args.format || \"both\";\n\n try {\n const result = getTypesFromFile(componentName, format);\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Get validated TypeScript examples for a component\n *\n * These examples are type-checked against the actual component props\n * to ensure they compile and are correct.\n */\nexport function getComponentExamplesTs(args: GetComponentExamplesTsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n try {\n // If component name is not recognized in metadata, still try to find examples\n const lookupName = canonicalName || inputName;\n const examples = getComponentExamplesFromFile(lookupName);\n if (!examples) {\n const availableComponents = getAvailableComponents();\n return textResponse(\n `No TypeScript examples found for component \"${inputName}\". Available components with examples: ${availableComponents.join(\", \")}`\n );\n }\n\n return textResponse(examples);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// CLI Tool Handlers\n// ============================================================================\n\n/**\n * Get information about CLI commands and usage\n */\nexport function getCliUsage(args: GetCliUsageArgs = {}): ToolResponse {\n const commandName = args.command;\n\n if (commandName) {\n const command = cliCommands[commandName];\n if (!command) {\n return textResponse(\n `Command \"${commandName}\" not found. Available commands: ${Object.keys(cliCommands).join(\", \")}`\n );\n }\n\n return textResponse(`# ${commandName}\n\n${command.description}\n\n## Usage\n\\`\\`\\`bash\n${command.usage}\n\\`\\`\\`\n\n## Options\n${command.options.map((opt: any) => `- \\`${opt.flag}\\`: ${opt.description}`).join(\"\\n\")}\n\n## Examples\n${command.examples.map((ex: string) => `\\`\\`\\`bash\\n${ex}\\n\\`\\`\\``).join(\"\\n\\n\")}\n`);\n }\n\n // Return all commands\n const allCommands = Object.entries(cliCommands).map(([name, data]) => ({\n name,\n description: data.description,\n usage: data.usage,\n }));\n\n return jsonResponse(allCommands);\n}\n\n// ============================================================================\n// Icon Tool Handlers\n// ============================================================================\n\n/**\n * Search for Material Design Icons\n */\nexport function searchIcons(args: SearchIconsArgs): ToolResponse {\n const query = args.query?.toLowerCase() || \"\";\n const limit = args.limit || 20;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n // Filter icons that match the query\n const matchingIcons = iconsData.icons.filter((icon: string) =>\n icon.toLowerCase().includes(query)\n );\n\n // Limit results\n const limitedResults = matchingIcons.slice(0, limit);\n\n const result = {\n query,\n total: iconsData.total,\n matches: matchingIcons.length,\n returned: limitedResults.length,\n icons: limitedResults,\n };\n\n return jsonResponse(result);\n}\n\n// ============================================================================\n// Theme Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for theme types\n */\nexport function getThemeTypes(args: GetThemeTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getThemeTypesFromFile(format);\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Navigation Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for navigation types\n */\nexport function getNavigationTypes(args: GetNavigationTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getNavigationTypesFromFile(format);\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get documentation for the translate package\n */\nexport function getTranslateGuide(args: GetTranslateGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://translate/${topic}`;\n const guide = translateGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, runtime-api, babel-plugin, translation-files, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the storage package\n */\nexport function getStorageGuide(args: GetStorageGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://storage/${topic}`;\n const guide = storageGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n// ============================================================================\n// Package Tool Handlers\n// ============================================================================\n\n/**\n * List all available packages\n */\nexport function listPackages(args: ListPackagesArgs = {}): ToolResponse {\n const category = args.category;\n\n if (category) {\n // Filter by specific category\n const byCategory = getPackagesByCat();\n const packageList = (byCategory[category] || []).map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n\n return jsonResponse(packageList);\n }\n\n // Return all packages grouped by category\n const allPackages = getPackageSummary();\n const grouped = allPackages.reduce(\n (acc, pkg) => {\n const cat = pkg.category;\n if (!acc[cat]) acc[cat] = [];\n acc[cat].push(pkg);\n return acc;\n },\n {} as Record<string, typeof allPackages>\n );\n\n return jsonResponse(grouped);\n}\n\n/**\n * Get detailed documentation for a package\n */\nexport function getPackageDocs(args: GetPackageDocsArgs): ToolResponse {\n const packageName = args.package;\n const section = args.section;\n\n // Handle both formats: \"camera\" and \"@idealyst/camera\"\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n const pkg = packages[normalizedName];\n\n if (!pkg) {\n const availablePackages = Object.keys(packages).join(\", \");\n return textResponse(\n `Package \"${packageName}\" not found. Available packages: ${availablePackages}`\n );\n }\n\n // Build documentation based on section or return all\n let docs = \"\";\n\n if (!section || section === \"overview\") {\n docs += `# ${pkg.name} (${pkg.npmName})\n\n${pkg.description}\n\n**Category:** ${pkg.category}\n**Platforms:** ${pkg.platforms.join(\", \")}\n**Documentation Status:** ${pkg.documentationStatus}\n\n`;\n }\n\n if (!section || section === \"installation\") {\n docs += `## Installation\n\n\\`\\`\\`bash\n${pkg.installation}\n\\`\\`\\`\n\n`;\n if (pkg.peerDependencies && pkg.peerDependencies.length > 0) {\n docs += `### Peer Dependencies\n${pkg.peerDependencies.map((dep) => `- ${dep}`).join(\"\\n\")}\n\n`;\n }\n }\n\n if (!section || section === \"features\") {\n docs += `## Features\n\n${pkg.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n`;\n }\n\n if (!section || section === \"quickstart\") {\n docs += `## Quick Start\n\n\\`\\`\\`tsx\n${pkg.quickStart}\n\\`\\`\\`\n\n`;\n }\n\n if (!section || section === \"api\") {\n if (pkg.apiHighlights && pkg.apiHighlights.length > 0) {\n docs += `## API Highlights\n\n${pkg.apiHighlights.map((api) => `- \\`${api}\\``).join(\"\\n\")}\n\n`;\n }\n }\n\n if (pkg.relatedPackages && pkg.relatedPackages.length > 0) {\n docs += `## Related Packages\n\n${pkg.relatedPackages.map((rp) => `- @idealyst/${rp}`).join(\"\\n\")}\n`;\n }\n\n return textResponse(docs.trim());\n}\n\n/**\n * Search across all packages\n */\nexport function searchPackages(args: SearchPackagesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchPackagesData(query);\n\n if (results.length === 0) {\n return textResponse(\n `No packages found matching \"${query}\". Try searching for: camera, oauth, storage, translate, datagrid, datepicker, navigation, etc.`\n );\n }\n\n const resultList = results.map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Recipe Tool Handlers\n// ============================================================================\n\n/**\n * List all available recipes\n */\nexport function listRecipes(args: ListRecipesArgs = {}): ToolResponse {\n const category = args.category;\n const difficulty = args.difficulty;\n\n let recipeList = getRecipeSummary();\n\n // Filter by category\n if (category) {\n recipeList = recipeList.filter((r) => r.category === category);\n }\n\n // Filter by difficulty\n if (difficulty) {\n recipeList = recipeList.filter((r) => r.difficulty === difficulty);\n }\n\n // Group by category for readability\n if (!category) {\n const grouped = recipeList.reduce(\n (acc, recipe) => {\n if (!acc[recipe.category]) acc[recipe.category] = [];\n acc[recipe.category].push(recipe);\n return acc;\n },\n {} as Record<string, typeof recipeList>\n );\n\n return jsonResponse(grouped);\n }\n\n return jsonResponse(recipeList);\n}\n\n/**\n * Get a complete code recipe\n */\nexport function getRecipe(args: GetRecipeArgs): ToolResponse {\n const recipeId = args.recipe;\n\n // Normalize the recipe ID (handle both \"login-form\" and \"loginForm\" etc)\n const normalizedId = recipeId.toLowerCase().replace(/\\s+/g, \"-\");\n const recipe = recipes[normalizedId];\n\n if (!recipe) {\n const availableRecipes = Object.keys(recipes).join(\", \");\n return textResponse(\n `Recipe \"${recipeId}\" not found.\\n\\nAvailable recipes: ${availableRecipes}`\n );\n }\n\n // Format the recipe as markdown\n const output = `# ${recipe.name}\n\n${recipe.description}\n\n**Category:** ${recipe.category}\n**Difficulty:** ${recipe.difficulty}\n**Required packages:** ${recipe.packages.join(\", \")}\n\n## Code\n\n\\`\\`\\`tsx\n${recipe.code}\n\\`\\`\\`\n\n## Explanation\n\n${recipe.explanation}\n\n${\n recipe.tips && recipe.tips.length > 0\n ? `## Tips\n\n${recipe.tips.map((tip) => `- ${tip}`).join(\"\\n\")}`\n : \"\"\n}\n\n${\n recipe.relatedRecipes && recipe.relatedRecipes.length > 0\n ? `## Related Recipes\n\n${recipe.relatedRecipes.map((r) => `- ${r}`).join(\"\\n\")}`\n : \"\"\n}\n`;\n\n return textResponse(output.trim());\n}\n\n/**\n * Search for recipes\n */\nexport function searchRecipes(args: SearchRecipesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchRecipesData(query);\n\n if (results.length === 0) {\n return textResponse(\n `No recipes found matching \"${query}\". Try searching for: login, form, navigation, settings, auth, list, modal, etc.`\n );\n }\n\n const resultList = results.map((recipe) => ({\n id: Object.entries(recipes).find(([_, r]) => r === recipe)?.[0],\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Install Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get detailed installation guide for a package\n */\nexport function getInstallGuide(args: GetInstallGuideArgs): ToolResponse {\n const packageName = args.package;\n\n if (!packageName) {\n return textResponse(\"Please provide a package name.\");\n }\n\n const guide = getInstallGuideData(packageName);\n\n if (!guide) {\n const availablePackages = Object.keys(installGuides).join(\", \");\n return textResponse(\n `No installation guide found for \"${packageName}\".\\n\\nAvailable packages: ${availablePackages}`\n );\n }\n\n // Format as detailed markdown\n const markdown = formatInstallGuideMarkdown(guide);\n return textResponse(markdown);\n}\n\n// ============================================================================\n// Handler Registry\n// ============================================================================\n\n/**\n * Map of all tool handlers by name.\n * Use this for dynamic tool dispatch.\n */\nexport const toolHandlers: Record<string, (args: any) => ToolResponse> = {\n list_components: listComponents,\n get_component_docs: getComponentDocs,\n get_component_example: getComponentExample,\n search_components: searchComponents,\n get_component_types: getComponentTypes,\n get_component_examples_ts: getComponentExamplesTs,\n get_cli_usage: getCliUsage,\n search_icons: searchIcons,\n get_theme_types: getThemeTypes,\n get_navigation_types: getNavigationTypes,\n get_translate_guide: getTranslateGuide,\n get_storage_guide: getStorageGuide,\n list_packages: listPackages,\n get_package_docs: getPackageDocs,\n search_packages: searchPackages,\n list_recipes: listRecipes,\n get_recipe: getRecipe,\n search_recipes: searchRecipes,\n get_install_guide: getInstallGuide,\n};\n\n/**\n * Call a tool by name with arguments.\n * Returns a tool response or throws if the tool is not found.\n */\nexport function callTool(name: string, args: Record<string, unknown> = {}): ToolResponse {\n const handler = toolHandlers[name];\n\n if (!handler) {\n return textResponse(`Unknown tool: ${name}`);\n }\n\n return handler(args);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACV9D,oBAAuB;AACvB,mBAAqC;AACrC,mBAKO;;;ACTA,IAAM,kBAA0C;AAAA,EACrD,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FxC,4CAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoH5C,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4QhC,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiN5B,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+JvC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsFrC,sCAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyNtC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyJrC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6KrC,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmPpC,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkN3C;;;ACv4DO,IAAM,mBAA2C;AAAA,EACtD,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8FlC,6CAA6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0O7C,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyNzC,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoTxC,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgfvC,gDAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiWhD,2CAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6b7C;;;ACpmEO,IAAM,kBAA0C;AAAA,EACrD,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiHjC,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsKpC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2NrC,0CAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsP1C,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+RnC;;;ACxgCO,IAAM,gBAAwC;AAAA,EACnD,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkE/B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwG1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuPjC;;;AClaO,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,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","names":["__filename","searchComponents","getComponentTypes","getThemeTypes","getNavigationTypes","searchPackages","searchRecipes","getInstallGuide"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/index.ts","../src/data/framework-guides.ts","../src/data/navigation-guides.ts","../src/data/translate-guides.ts","../src/data/storage-guides.ts","../src/data/icon-guide.ts","../src/data/packages.ts","../src/data/recipes/auth.ts","../src/data/recipes/settings.ts","../src/data/recipes/navigation.ts","../src/data/recipes/data.ts","../src/data/recipes/layout.ts","../src/data/recipes/forms.ts","../src/data/recipes/media.ts","../src/data/recipes/index.ts","../src/tools/definitions.ts","../src/data/component-metadata.ts","../src/data/cli-commands.ts","../src/data/audio-guides.ts","../src/data/camera-guides.ts","../src/data/files-guides.ts","../src/data/oauth-client-guides.ts","../src/data/animate-guides.ts","../src/data/datagrid-guides.ts","../src/data/datepicker-guides.ts","../src/data/lottie-guides.ts","../src/data/markdown-guides.ts","../src/data/config-guides.ts","../src/data/charts-guides.ts","../src/data/install-guides.ts","../src/data/intro.ts","../src/data/icons.json","../src/tools/get-types.ts","../src/tools/handlers.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { frameworkGuides } from \"./data/framework-guides.js\";\nimport { navigationGuides } from \"./data/navigation-guides.js\";\nimport { translateGuides } from \"./data/translate-guides.js\";\nimport { storageGuides } from \"./data/storage-guides.js\";\nimport { iconGuide } from \"./data/icon-guide.js\";\nimport {\n packages,\n getPackagesByCategory,\n} from \"./data/packages.js\";\nimport {\n recipes,\n getRecipesByCategory,\n} from \"./data/recipes/index.js\";\n\n// Import tool definitions and handler from the extracted tools module\nimport { toolDefinitions, callTool } from \"./tools/index.js\";\n\nconst server = new Server(\n {\n name: \"@idealyst/mcp-server\",\n version: \"1.0.94\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n);\n\n// List all available tools\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: toolDefinitions,\n };\n});\n\n// Handle tool calls\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n return callTool(name, args || {});\n});\n\n// List available resources\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"idealyst://packages/overview\",\n name: \"Idealyst Packages Overview\",\n description: \"Overview of all available @idealyst packages organized by category\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://recipes/overview\",\n name: \"Idealyst Recipes Overview\",\n description: \"Overview of all available code recipes for common UI patterns\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/getting-started\",\n name: \"Getting Started with Idealyst\",\n description: \"Complete guide to setting up and using the Idealyst framework\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/components-overview\",\n name: \"Components Overview\",\n description: \"Overview of all available Idealyst components organized by category\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/theming\",\n name: \"Theming Guide\",\n description: \"Guide to customizing themes in Idealyst\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://framework/cli\",\n name: \"CLI Reference\",\n description: \"Complete reference for the Idealyst CLI\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/overview\",\n name: \"Navigation System Overview\",\n description: \"Overview of the Idealyst navigation system for cross-platform routing\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/route-configuration\",\n name: \"Route Configuration\",\n description: \"Learn how to define and structure routes in Idealyst\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/navigator-types\",\n name: \"Navigator Types\",\n description: \"Guide to stack, tab, drawer, and modal navigators\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/custom-layouts\",\n name: \"Custom Layouts (Web)\",\n description: \"Creating custom layouts with headers and sidebars for web applications\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/use-navigator\",\n name: \"useNavigator Hook\",\n description: \"Complete reference for the useNavigator hook API\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://navigation/web-mobile-parity\",\n name: \"Web/Mobile Navigation Parity\",\n description: \"How to achieve native-like navigation UI on web using layout components\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://icons/reference\",\n name: \"Icon Reference Guide\",\n description: \"Complete guide to Material Design Icons with 7,447 available icons, common icons by category, and usage examples\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/overview\",\n name: \"Translation Overview\",\n description: \"Overview of @idealyst/translate internationalization package\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/runtime-api\",\n name: \"Translation Runtime API\",\n description: \"Complete reference for TranslateProvider, useTranslation, useLanguage, and Trans component\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/babel-plugin\",\n name: \"Translation Babel Plugin\",\n description: \"Guide to the Babel plugin for static key extraction and missing translation detection\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/translation-files\",\n name: \"Translation File Format\",\n description: \"Guide to organizing and formatting translation JSON files\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://translate/examples\",\n name: \"Translation Examples\",\n description: \"Complete code examples for common translation patterns\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/overview\",\n name: \"Storage Overview\",\n description: \"Overview of @idealyst/storage cross-platform storage package\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/api\",\n name: \"Storage API Reference\",\n description: \"Complete API reference for @idealyst/storage\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"idealyst://storage/examples\",\n name: \"Storage Examples\",\n description: \"Complete code examples for common storage patterns\",\n mimeType: \"text/markdown\",\n },\n ],\n };\n});\n\n// Handle resource reads\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n // Check all guide sources\n let guide = frameworkGuides[uri] || navigationGuides[uri] || translateGuides[uri] || storageGuides[uri];\n\n // Handle icon reference\n if (uri === \"idealyst://icons/reference\") {\n guide = iconGuide;\n }\n\n // Handle recipes overview\n if (uri === \"idealyst://recipes/overview\") {\n const byCategory = getRecipesByCategory();\n const categoryLabels: Record<string, string> = {\n auth: \"Authentication\",\n forms: \"Forms & Validation\",\n navigation: \"Navigation\",\n data: \"Data & Lists\",\n layout: \"Layout & Modals\",\n settings: \"Settings & Preferences\",\n media: \"Media & Uploads\",\n };\n\n let content = `# Idealyst Recipes\n\nReady-to-use code examples for common UI patterns in Idealyst apps.\n\n`;\n\n for (const [category, recipeList] of Object.entries(byCategory)) {\n content += `## ${categoryLabels[category] || category}\\n\\n`;\n\n for (const recipe of recipeList) {\n const id = Object.entries(recipes).find(([_, r]) => r === recipe)?.[0];\n content += `### ${recipe.name}\n${recipe.description}\n\n- **Difficulty:** ${recipe.difficulty}\n- **Packages:** ${recipe.packages.join(\", \")}\n- **Get recipe:** \\`get_recipe({ recipe: \"${id}\" })\\`\n\n`;\n }\n }\n\n guide = content;\n }\n\n // Handle packages overview\n if (uri === \"idealyst://packages/overview\") {\n const byCategory = getPackagesByCategory();\n const categoryOrder = [\"core\", \"ui\", \"data\", \"media\", \"auth\", \"utility\", \"tooling\"];\n const categoryLabels: Record<string, string> = {\n core: \"Core Packages\",\n ui: \"UI Components\",\n data: \"Data & Storage\",\n media: \"Media & Hardware\",\n auth: \"Authentication\",\n utility: \"Utilities\",\n tooling: \"Developer Tooling\",\n };\n\n let content = `# Idealyst Framework Packages\n\nThe Idealyst Framework provides a comprehensive set of packages for building cross-platform React applications.\n\n`;\n\n for (const category of categoryOrder) {\n const pkgs = byCategory[category];\n if (!pkgs || pkgs.length === 0) continue;\n\n content += `## ${categoryLabels[category] || category}\\n\\n`;\n\n for (const pkg of pkgs) {\n const platforms = pkg.platforms.join(\", \");\n content += `### ${pkg.name} (\\`${pkg.npmName}\\`)\n${pkg.description}\n\n- **Platforms:** ${platforms}\n- **Install:** \\`${pkg.installation}\\`\n\n`;\n }\n }\n\n guide = content;\n }\n\n if (!guide) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return {\n contents: [\n {\n uri,\n mimeType: \"text/markdown\",\n text: guide,\n },\n ],\n };\n});\n\n// Start the server\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"Idealyst MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","export const frameworkGuides: Record<string, string> = {\n \"idealyst://framework/getting-started\": `# Getting Started with Idealyst\n\nIdealyst is a modern, cross-platform framework for building React and React Native applications with a powerful component library, type-safe APIs, and monorepo tooling.\n\n## Quick Start\n\n### 1. Create a New Workspace\n\n\\`\\`\\`bash\nnpx @idealyst/cli init my-app\ncd my-app\n\\`\\`\\`\n\nThis single command creates a **complete monorepo workspace** with all 5 packages:\n- \\`packages/web/\\` - React web app (Vite)\n- \\`packages/native/\\` - React Native mobile app\n- \\`packages/api/\\` - tRPC API server with GraphQL\n- \\`packages/database/\\` - Prisma database layer\n- \\`packages/shared/\\` - Shared utilities and tRPC client\n\nPlus:\n- Yarn 3 workspace setup\n- TypeScript configuration\n- Jest testing setup\n- Git repository\n- Dev container configuration\n\n### 2. Start Development\n\n\\`\\`\\`bash\n# Start web dev server\ncd packages/web\nyarn dev\n\n# Start native dev (in another terminal)\ncd packages/native\nyarn start\n\n# Start API server (in another terminal)\ncd packages/api\nyarn dev\n\\`\\`\\`\n\n### 3. Configure Babel (Required for Styling)\n\nAdd the Idealyst plugin to your babel.config.js:\n\n\\`\\`\\`javascript\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/theme/plugin', {\n themePath: './src/theme/styles.ts', // Path to your theme file\n }],\n ],\n};\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\nmy-app/\n├── packages/\n│ ├── web/ # React web app (Vite)\n│ ├── native/ # React Native app\n│ ├── api/ # tRPC + GraphQL API server\n│ ├── database/ # Prisma database layer\n│ └── shared/ # Shared utilities & tRPC client\n├── package.json\n├── tsconfig.json\n└── yarn.lock\n\\`\\`\\`\n\n## Key Features\n\n- **Cross-Platform Components**: Use the same components for web and native\n- **Type-Safe APIs**: End-to-end type safety with tRPC\n- **Modern Tooling**: Vite, TypeScript, Jest, Prisma\n- **Monorepo Structure**: Share code across packages\n- **Theme System**: Consistent styling with react-native-unistyles\n- **Style Extensions**: Customize component styles at build time\n- **Navigation**: Unified navigation for web and native\n\n## Next Steps\n\n1. Explore the component library: \\`@idealyst/components\\`\n2. Learn the style system: \\`idealyst://framework/style-system\\`\n3. Set up your database schema in \\`packages/database\\`\n4. Define your API routes in \\`packages/api\\`\n5. Build your UI using Idealyst components\n`,\n\n \"idealyst://framework/components-overview\": `# Idealyst Components Overview\n\nIdealyst provides a comprehensive library of cross-platform React components organized into categories.\n\n## Component Categories\n\n### Layout Components\n- **View**: Flex container with spacing system\n- **Screen**: Full-screen container with safe area handling\n- **Divider**: Visual separator with orientation options\n\n### Form Components\n- **Button**: Interactive button with variants, intents, and icons\n- **Input**: Text input with label, validation, and helper text\n- **Checkbox**: Form checkbox with label support\n- **Select**: Dropdown selection component\n- **Switch**: Toggle switch component\n- **RadioButton**: Radio button group\n- **Slider**: Range slider component\n- **TextArea**: Multi-line text input\n\n### Display Components\n- **Text**: Styled text with sizes and weights\n- **Card**: Content container with variants\n- **Badge**: Status indicator\n- **Chip**: Compact element for tags and filters\n- **Avatar**: User profile image\n- **Icon**: MDI icon with theming\n- **Skeleton**: Loading placeholder\n- **Alert**: Notification message\n- **Accordion**: Collapsible content sections\n- **Image**: Cross-platform image component\n- **SVGImage**: SVG image renderer\n- **Video**: Video player component\n\n### Navigation Components\n- **Tabs**: Tab navigation\n- **TabBar**: Bottom tab bar\n- **Breadcrumb**: Breadcrumb navigation\n- **Menu**: Dropdown menu\n- **MenuItem**: Individual menu item\n- **List**: Vertical list with sections\n- **ListItem**: Individual list item\n- **Link**: Navigation link component\n\n### Overlay Components\n- **Dialog**: Modal dialog\n- **Popover**: Contextual overlay\n- **Tooltip**: Hover tooltip\n\n### Feedback Components\n- **Progress**: Progress indicator (linear/circular)\n- **ActivityIndicator**: Loading spinner\n\n### Data Components\n- **Table**: Data table with sorting and filtering\n- **DataGrid**: Advanced data grid\n- **DatePicker**: Date selection component\n- **TimePicker**: Time selection component\n- **DateTimePicker**: Combined date and time picker\n\n## Common Props\n\nMost components share common props:\n- \\`style\\`: Custom styles\n- \\`testID\\`: Test identifier\n- \\`disabled\\`: Disable interaction\n\n### Intent Colors\nComponents support intent-based colors:\n- \\`primary\\`: Main brand actions\n- \\`neutral\\`: Secondary actions\n- \\`success\\`: Positive actions\n- \\`error\\`: Destructive actions\n- \\`warning\\`: Caution actions\n\n### Type/Variant Props\nMany components offer visual type or variant options:\n- Button \\`type\\`: \\`contained\\`, \\`outlined\\`, \\`text\\`\n- Card \\`type\\`: \\`default\\`, \\`outlined\\`, \\`elevated\\`, \\`filled\\`\n- Chip \\`type\\`: \\`filled\\`, \\`outlined\\`, \\`soft\\`\n- Progress \\`variant\\`: \\`linear\\`, \\`circular\\`\n\n### Sizes\nMost components support size variants:\n- \\`sm\\`, \\`md\\`, \\`lg\\`\n- Sometimes 'xs' and 'xl', but varies by component\n\n## Icon Support\n\nComponents with icon support accept:\n- **String icon names**: Material Design Icons\n- **React elements**: Custom icon components\n\nExample:\n\\`\\`\\`tsx\n<Button leftIcon=\"check\">Save</Button>\n<Button leftIcon={<CustomIcon />}>Save</Button>\n<Button rightIcon=\"arrow-right\">Next</Button>\n\\`\\`\\`\n\n## Theming\n\nAll components use the Unistyles theming system:\n- Light and dark mode support\n- Customizable color palettes\n- Responsive breakpoints\n- Platform-specific styles\n\n## Import Pattern\n\n\\`\\`\\`tsx\nimport { Button, Card, Text, View } from '@idealyst/components';\n\\`\\`\\`\n`,\n\n \"idealyst://framework/theming\": `# Theming Guide\n\nIdealyst uses react-native-unistyles for cross-platform theming with full TypeScript support. Themes are created using a fluent builder pattern.\n\n## Theme Builder API\n\nCreate themes using the builder pattern:\n\n\\`\\`\\`typescript\nimport { createTheme } from '@idealyst/theme';\n\nexport const myTheme = createTheme()\n // Add semantic intents\n .addIntent('primary', {\n primary: '#3b82f6', // Main color\n contrast: '#ffffff', // Text on primary background\n light: '#bfdbfe', // Lighter variant\n dark: '#1e40af', // Darker variant\n })\n .addIntent('success', {\n primary: '#22c55e',\n contrast: '#ffffff',\n light: '#a7f3d0',\n dark: '#165e29',\n })\n .addIntent('danger', {\n primary: '#ef4444',\n contrast: '#ffffff',\n light: '#fca5a1',\n dark: '#9b2222',\n })\n\n // Add border radii\n .addRadius('none', 0)\n .addRadius('sm', 4)\n .addRadius('md', 8)\n .addRadius('lg', 12)\n\n // Add shadows (cross-platform)\n .addShadow('sm', {\n elevation: 1,\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.08,\n shadowRadius: 1,\n boxShadow: '0px 1px 2px rgba(0, 0, 0, 0.1)', // web-only\n })\n\n // Set colors\n .setColors({\n pallet: { /* color palette */ },\n surface: {\n screen: '#ffffff',\n primary: '#ffffff',\n secondary: '#f5f5f5',\n inverse: '#000000',\n },\n text: {\n primary: '#000000',\n secondary: '#333333',\n inverse: '#ffffff',\n },\n border: {\n primary: '#e0e0e0',\n disabled: '#f0f0f0',\n },\n })\n\n // Set component sizes (xs, sm, md, lg, xl)\n .setSizes({\n button: {\n xs: { paddingVertical: 4, paddingHorizontal: 8, minHeight: 24, fontSize: 12 },\n sm: { paddingVertical: 6, paddingHorizontal: 12, minHeight: 32, fontSize: 14 },\n md: { paddingVertical: 8, paddingHorizontal: 16, minHeight: 40, fontSize: 16 },\n lg: { paddingVertical: 10, paddingHorizontal: 20, minHeight: 48, fontSize: 18 },\n xl: { paddingVertical: 12, paddingHorizontal: 24, minHeight: 56, fontSize: 20 },\n },\n // ... other components (chip, badge, icon, input, etc.)\n })\n\n // Set interaction styles\n .setInteraction({\n focusedBackground: 'rgba(59, 130, 246, 0.08)',\n focusBorder: 'rgba(59, 130, 246, 0.3)',\n opacity: { hover: 0.9, active: 0.75, disabled: 0.5 },\n })\n\n // Set responsive breakpoints\n .setBreakpoints({\n xs: 0, // Portrait phones\n sm: 576, // Landscape phones\n md: 768, // Tablets\n lg: 992, // Desktops\n xl: 1200, // Large desktops\n })\n\n .build();\n\\`\\`\\`\n\n## Intent Structure\n\nEach intent defines four color values:\n\n| Property | Purpose |\n|------------|-----------------------------------|\n| \\`primary\\` | Main color used for backgrounds |\n| \\`contrast\\` | Text color on primary background |\n| \\`light\\` | Lighter tint for subtle states |\n| \\`dark\\` | Darker shade for pressed states |\n\n## Extending an Existing Theme\n\nUse \\`fromTheme()\\` to extend a base theme:\n\n\\`\\`\\`typescript\nimport { fromTheme, lightTheme } from '@idealyst/theme';\n\nexport const brandTheme = fromTheme(lightTheme)\n .addIntent('brand', {\n primary: '#6366f1',\n contrast: '#ffffff',\n light: '#818cf8',\n dark: '#4f46e5',\n })\n .build();\n\\`\\`\\`\n\n## Modifying Intents\n\n### setIntent() - Replace an existing intent\n\nUse \\`setIntent()\\` to override an intent from a base theme:\n\n\\`\\`\\`typescript\nconst customTheme = fromTheme(lightTheme)\n .setIntent('primary', {\n primary: '#6366f1', // Change brand color\n contrast: '#ffffff',\n light: '#a5b4fc',\n dark: '#4338ca',\n })\n .build();\n\\`\\`\\`\n\n## Modifying Colors\n\n### Individual Color Methods\n\nInstead of replacing all colors with \\`setColors()\\`, you can add or modify individual colors:\n\n\\`\\`\\`typescript\nconst theme = fromTheme(lightTheme)\n // Add new surface colors\n .addSurfaceColor('card', '#ffffff')\n .addSurfaceColor('modal', 'rgba(0,0,0,0.5)')\n\n // Replace existing surface colors\n .setSurfaceColor('screen', '#fafafa')\n\n // Add new text colors\n .addTextColor('muted', '#9ca3af')\n .addTextColor('link', '#3b82f6')\n\n // Replace existing text colors\n .setTextColor('primary', '#111827')\n\n // Add new border colors\n .addBorderColor('focus', '#3b82f6')\n .addBorderColor('error', '#ef4444')\n\n // Replace existing border colors\n .setBorderColor('primary', '#d1d5db')\n\n // Add new pallet colors (full shade set)\n .addPalletColor('brand', {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n })\n\n // Replace existing pallet colors\n .setPalletColor('blue', { /* new shades */ })\n\n .build();\n\\`\\`\\`\n\n### Color Method Reference\n\n| Method | Purpose | Type Change |\n|--------|---------|-------------|\n| \\`addSurfaceColor(name, value)\\` | Add new surface color | Expands type union |\n| \\`setSurfaceColor(name, value)\\` | Replace existing surface color | No type change |\n| \\`addTextColor(name, value)\\` | Add new text color | Expands type union |\n| \\`setTextColor(name, value)\\` | Replace existing text color | No type change |\n| \\`addBorderColor(name, value)\\` | Add new border color | Expands type union |\n| \\`setBorderColor(name, value)\\` | Replace existing border color | No type change |\n| \\`addPalletColor(name, shades)\\` | Add new pallet with all shades | Expands type union |\n| \\`setPalletColor(name, shades)\\` | Replace existing pallet | No type change |\n\n## Registering Your Theme\n\nFor full TypeScript inference:\n\n\\`\\`\\`typescript\n// src/theme/styles.ts\nexport const myTheme = createTheme()\n // ... builder chain\n .build();\n\n// Register the theme type\ndeclare module '@idealyst/theme' {\n interface RegisteredTheme {\n theme: typeof myTheme;\n }\n}\n\\`\\`\\`\n\n## Using Themes with Unistyles\n\n\\`\\`\\`typescript\nimport { UnistylesRegistry } from 'react-native-unistyles';\nimport { lightTheme, darkTheme } from '@idealyst/theme';\n\nUnistylesRegistry\n .addThemes({\n light: lightTheme,\n dark: darkTheme,\n })\n .addConfig({\n initialTheme: 'light',\n });\n\\`\\`\\`\n\n## useTheme Hook\n\nAccess the current theme in your components with full TypeScript inference:\n\n\\`\\`\\`typescript\nimport { useTheme } from '@idealyst/theme';\n\nfunction MyComponent() {\n const theme = useTheme();\n\n return (\n <View style={{ backgroundColor: theme.colors.surface.primary }}>\n <Text style={{ color: theme.colors.text.primary }}>\n Hello\n </Text>\n </View>\n );\n}\n\\`\\`\\`\n\nThe hook returns the properly typed theme based on your registered theme type:\n\n\\`\\`\\`typescript\nconst theme = useTheme();\n\n// Access intent colors\nconst primaryColor = theme.intents.primary.primary;\nconst successLight = theme.intents.success.light;\n\n// Access sizes\nconst buttonPadding = theme.sizes.button.md.paddingHorizontal;\n\n// Access radii\nconst borderRadius = theme.radii.md;\n\n// Access surface colors\nconst screenBg = theme.colors.surface.screen;\n\n// Access text colors\nconst textColor = theme.colors.text.primary;\n\\`\\`\\`\n\n## Platform-Specific Styles\n\n\\`\\`\\`typescript\nconst styles = StyleSheet.create((theme) => ({\n button: {\n padding: 16,\n\n _web: {\n cursor: 'pointer',\n transition: 'all 0.1s ease',\n _hover: { opacity: 0.9 },\n _active: { opacity: 0.75 },\n },\n\n _native: {\n elevation: 2,\n },\n },\n}));\n\\`\\`\\`\n\n## See Also\n\n- \\`idealyst://framework/style-system\\` - Style definition APIs (defineStyle, extendStyle)\n- \\`idealyst://framework/babel-plugin\\` - Babel plugin configuration\n- \\`idealyst://framework/breakpoints\\` - Responsive breakpoint system\n`,\n\n \"idealyst://framework/cli\": `# Idealyst CLI Reference\n\nThe Idealyst CLI provides commands for creating and managing Idealyst projects.\n\n## Installation\n\n\\`\\`\\`bash\nnpm install -g @idealyst/cli\n# or\nnpx @idealyst/cli <command>\n\\`\\`\\`\n\n## Commands\n\n### init\n\nInitialize a new Idealyst workspace.\n\n\\`\\`\\`bash\nidealyst init <workspace-name> [options]\n\\`\\`\\`\n\n**Arguments:**\n- \\`workspace-name\\`: Name for the workspace directory\n\n**Options:**\n- \\`--git\\`: Initialize git repository (default: true)\n- \\`--no-git\\`: Skip git initialization\n- \\`--install\\`: Install dependencies (default: true)\n- \\`--no-install\\`: Skip dependency installation\n\n**Examples:**\n\\`\\`\\`bash\nidealyst init my-app\nidealyst init my-company-app --no-git\n\\`\\`\\`\n\n**Creates:**\n- Monorepo workspace structure\n- package.json with workspaces\n- TypeScript configuration\n- Jest setup\n- Git repository (optional)\n- Dev container configuration\n\n### create\n\nCreate a new package in the workspace.\n\n\\`\\`\\`bash\nidealyst create <name> --type <type> [options]\n\\`\\`\\`\n\n**Arguments:**\n- \\`name\\`: Package name\n\n**Options:**\n- \\`--type <type>\\`: Package type (required)\n - \\`web\\`: React web app with Vite\n - \\`mobile\\`: React Native mobile app\n - \\`api\\`: tRPC API server\n - \\`shared\\`: Shared utilities library\n- \\`--app-name <name>\\`: Display name for mobile apps (required for mobile)\n- \\`--with-trpc\\`: Include tRPC setup (web/mobile)\n- \\`--no-trpc\\`: Exclude tRPC setup (web/mobile)\n\n**Examples:**\n\\`\\`\\`bash\n# Web app\nidealyst create web --type web --with-trpc\n\n# Mobile app\nidealyst create mobile --type mobile --app-name \"My App\" --with-trpc\n\n# API server\nidealyst create api --type api\n\n# Shared library\nidealyst create shared --type shared\n\\`\\`\\`\n\n**Note:** The database package is automatically created during workspace initialization. Use the \\`init\\` command to create a new workspace with all packages including database.\n\n## Package Types\n\n### Web Package\n- Vite + React 19\n- TypeScript\n- React Router\n- Optional tRPC client\n- @idealyst/components\n- @idealyst/theme\n\n### Mobile Package\n- React Native 0.80\n- TypeScript\n- React Navigation\n- Optional tRPC client\n- @idealyst/components\n- @idealyst/navigation\n\n### API Package\n- tRPC server\n- Express\n- TypeScript\n- CORS enabled\n- WebSocket support\n\n### Database Package\n- Prisma ORM\n- TypeScript\n- Schema definition\n- Migration support\n- Multiple database support\n\n### Shared Package\n- TypeScript library\n- Utility functions\n- Type definitions\n- Shared between packages\n\n## Workspace Commands\n\nRun these from workspace root:\n\n\\`\\`\\`bash\n# Install all dependencies\nyarn install\n\n# Run tests\nyarn test\nyarn test:watch\nyarn test:coverage\n\n# Build all packages\nyarn workspaces foreach run build\n\n# Version management\nyarn version:patch # Bump patch version\nyarn version:minor # Bump minor version\nyarn version:major # Bump major version\n\n# Publish\nyarn publish:all\n\\`\\`\\`\n\n## Package Commands\n\nRun these from package directory:\n\n\\`\\`\\`bash\n# Development\nyarn dev\n\n# Build\nyarn build\n\n# Test\nyarn test\n\n# Type check\nyarn type-check\n\n# Lint\nyarn lint\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\nworkspace/\n├── packages/\n│ ├── web/\n│ │ ├── src/\n│ │ ├── public/\n│ │ ├── package.json\n│ │ └── vite.config.ts\n│ ├── mobile/\n│ │ ├── src/\n│ │ ├── android/\n│ │ ├── ios/\n│ │ └── package.json\n│ ├── api/\n│ │ ├── src/\n│ │ ├── trpc/\n│ │ └── package.json\n│ ├── database/\n│ │ ├── prisma/\n│ │ └── package.json\n│ └── shared/\n│ ├── src/\n│ └── package.json\n├── package.json\n├── tsconfig.json\n└── jest.config.js\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use workspaces**: Keep related packages in the same workspace\n2. **Share code**: Use the shared package for utilities\n3. **Type safety**: Enable strict TypeScript\n4. **Testing**: Write tests for critical functionality\n5. **Versioning**: Keep package versions synchronized\n6. **Documentation**: Add README files to packages\n7. **Git**: Use conventional commits\n8. **Dependencies**: Share dependencies across packages when possible\n`,\n\n \"idealyst://framework/spacing-system\": `# Spacing System\n\nIdealyst components use a variant-based spacing system for consistent layouts. Instead of specifying numeric values, you use Size variants (xs, sm, md, lg, xl) that map to theme-defined values.\n\n## Spacing Prop Interfaces\n\nDifferent component types receive different spacing props based on their use case:\n\n### ContainerStyleProps (Layout Containers)\n**Components**: View, Card, Screen, List, Accordion, Table, TabBar\n\n\\`\\`\\`typescript\ninterface ContainerStyleProps {\n gap?: Size; // Space between children\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n margin?: Size; // Margin on all sides\n marginVertical?: Size; // Top and bottom margin\n marginHorizontal?: Size; // Left and right margin\n}\n\\`\\`\\`\n\n### TextSpacingStyleProps (Text Components)\n**Components**: Text\n\n\\`\\`\\`typescript\ninterface TextSpacingStyleProps {\n gap?: Size; // Space between nested elements\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n}\n\\`\\`\\`\n\n### PressableSpacingStyleProps (Interactive Elements)\n**Components**: Pressable\n\n\\`\\`\\`typescript\ninterface PressableSpacingStyleProps {\n padding?: Size; // Padding on all sides\n paddingVertical?: Size; // Top and bottom padding\n paddingHorizontal?: Size; // Left and right padding\n}\n\\`\\`\\`\n\n### FormInputStyleProps (Form Inputs)\n**Components**: Input, Select, TextArea, Checkbox, RadioButton, Switch, Slider\n\n\\`\\`\\`typescript\ninterface FormInputStyleProps {\n margin?: Size; // Margin on all sides\n marginVertical?: Size; // Top and bottom margin\n marginHorizontal?: Size; // Left and right margin\n}\n\\`\\`\\`\n\n## Size Values\n\nSize variants map to theme values:\n\n| Size | Padding | Spacing (Gap) |\n|------|---------|---------------|\n| xs | 4px | 4px |\n| sm | 8px | 8px |\n| md | 16px | 16px |\n| lg | 24px | 24px |\n| xl | 32px | 32px |\n\n## Usage Examples\n\n### Container Spacing\n\n\\`\\`\\`tsx\nimport { View, Card, Text } from '@idealyst/components';\n\n// Gap between children\n<View gap=\"md\">\n <Text>Item 1</Text>\n <Text>Item 2</Text>\n</View>\n\n// Padding inside container\n<Card padding=\"lg\" gap=\"sm\">\n <Text weight=\"bold\">Card Title</Text>\n <Text>Card content</Text>\n</Card>\n\n// Directional padding\n<View paddingVertical=\"md\" paddingHorizontal=\"lg\">\n <Text>Content with different vertical/horizontal padding</Text>\n</View>\n\n// Margin for spacing between containers\n<Card margin=\"md\" padding=\"lg\">\n <Text>Card with margin</Text>\n</Card>\n\\`\\`\\`\n\n### Form Input Spacing\n\n\\`\\`\\`tsx\nimport { TextInput, Checkbox, View } from '@idealyst/components';\n\n// Use margin to space form fields\n<View>\n <TextInput placeholder=\"Email\" marginVertical=\"sm\" />\n <TextInput placeholder=\"Password\" marginVertical=\"sm\" />\n <Checkbox label=\"Remember me\" marginVertical=\"md\" />\n</View>\n\\`\\`\\`\n\n### Combining with Style Prop\n\nThe spacing props work alongside the style prop:\n\n\\`\\`\\`tsx\n<View\n gap=\"md\"\n padding=\"lg\"\n style={{ backgroundColor: '#f5f5f5', borderRadius: 8 }}\n>\n <Text>Content</Text>\n</View>\n\\`\\`\\`\n\n## Custom Components\n\nYou can use the exported builder functions to add spacing variants to custom components:\n\n\\`\\`\\`typescript\nimport { StyleSheet } from 'react-native-unistyles';\nimport { Theme } from '@idealyst/theme';\nimport {\n buildGapVariants,\n buildPaddingVariants,\n buildMarginVariants,\n} from '@idealyst/components';\n\nexport const customStyles = StyleSheet.create((theme: Theme) => ({\n container: {\n variants: {\n gap: buildGapVariants(theme),\n padding: buildPaddingVariants(theme),\n margin: buildMarginVariants(theme),\n },\n },\n}));\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use variants for consistency**: Prefer Size variants over numeric values for consistent spacing across your app\n2. **Gap over margins for children**: Use \\`gap\\` to space children instead of margins on individual items\n3. **Directional props for precision**: Use paddingVertical/paddingHorizontal when you need different spacing\n4. **Form spacing with margin**: Use marginVertical on form inputs to create consistent form layouts\n5. **Combine with theme values**: The variant values come from the theme, ensuring consistency\n`,\n\n \"idealyst://framework/api-overview\": `# API Architecture Overview\n\nIdealyst provides a dual API architecture with both tRPC and GraphQL, giving you flexibility for different use cases.\n\n## When to Use Each\n\n### tRPC (Type-Safe RPC)\n- **Best for**: Internal clients, same-team consumption\n- **Benefits**: End-to-end type safety, no code generation, fast development\n- **Use when**: Your frontend and backend are TypeScript\n\n### GraphQL\n- **Best for**: Public APIs, third-party integrations, mobile apps\n- **Benefits**: Flexible queries, schema documentation, wide ecosystem\n- **Use when**: You need schema introspection or have non-TypeScript clients\n\n## Architecture\n\nBoth APIs run on the same Express server:\n\n\\`\\`\\`\nServer (port 3000)\n├── /trpc/* → tRPC handlers\n├── /graphql → GraphQL Yoga endpoint\n└── Shared context (database, auth)\n\\`\\`\\`\n\n## File Structure\n\n\\`\\`\\`\npackages/api/src/\n├── routers/ # tRPC routers\n│ ├── index.ts # Root router\n│ └── test.ts # Example router\n├── graphql/ # GraphQL setup\n│ ├── builder.ts # Pothos schema builder\n│ ├── index.ts # Yoga server setup\n│ └── types/ # GraphQL type definitions\n│ └── test.ts # Example types\n├── context.ts # Shared context\n├── server.ts # Express server\n└── index.ts # Entry point\n\\`\\`\\`\n\n## Shared Context\n\nBoth APIs share the same context:\n\n\\`\\`\\`typescript\n// context.ts\nexport interface Context {\n db: PrismaClient;\n // Add auth, session, etc.\n}\n\nexport async function createContext(): Promise<Context> {\n return {\n db: prisma,\n };\n}\n\\`\\`\\`\n\n## Client Setup\n\nThe shared package provides clients for both:\n\n\\`\\`\\`typescript\n// In your App component\nimport { createTRPCClient, createGraphQLClient } from '@your-app/shared';\n\n// tRPC - automatic type inference\nconst trpcClient = createTRPCClient({ apiUrl: 'http://localhost:3000/trpc' });\n\n// GraphQL - manual queries with graphql-request\ncreateGraphQLClient({ apiUrl: 'http://localhost:3000/graphql' });\n\\`\\`\\`\n\n## Migration Path\n\nStart with tRPC for rapid development, add GraphQL when you need:\n- Public API documentation\n- Third-party integrations\n- Schema-first development\n- Non-TypeScript clients\n`,\n\n \"idealyst://framework/graphql-setup\": `# GraphQL Setup Guide\n\nIdealyst uses Pothos (code-first schema) with GraphQL Yoga server, integrated with Prisma.\n\n## Server Setup\n\n### 1. Schema Builder (builder.ts)\n\n\\`\\`\\`typescript\nimport SchemaBuilder from '@pothos/core';\nimport PrismaPlugin from '@pothos/plugin-prisma';\nimport type PrismaTypes from './generated';\nimport { prisma } from '@your-app/database';\n\nexport const builder = new SchemaBuilder<{\n PrismaTypes: PrismaTypes;\n Context: { db: typeof prisma };\n}>({\n plugins: [PrismaPlugin],\n prisma: {\n client: prisma,\n },\n});\n\n// Initialize Query and Mutation types\nbuilder.queryType({});\nbuilder.mutationType({});\n\\`\\`\\`\n\n### 2. Generate Prisma Types\n\n\\`\\`\\`bash\n# In packages/api\nnpx prisma generate --generator pothos\n\\`\\`\\`\n\nAdd to your prisma schema:\n\n\\`\\`\\`prisma\ngenerator pothos {\n provider = \"prisma-pothos-types\"\n output = \"../src/graphql/generated.ts\"\n}\n\\`\\`\\`\n\n### 3. Define Types (types/example.ts)\n\n\\`\\`\\`typescript\nimport { builder } from '../builder';\n\n// Object type from Prisma model\nbuilder.prismaObject('Test', {\n fields: (t) => ({\n id: t.exposeID('id'),\n name: t.exposeString('name'),\n message: t.exposeString('message'),\n status: t.exposeString('status'),\n createdAt: t.expose('createdAt', { type: 'DateTime' }),\n }),\n});\n\n// Input type for mutations\nconst CreateTestInput = builder.inputType('CreateTestInput', {\n fields: (t) => ({\n name: t.string({ required: true }),\n message: t.string({ required: true }),\n status: t.string({ required: true }),\n }),\n});\n\n// Query\nbuilder.queryField('tests', (t) =>\n t.prismaField({\n type: ['Test'],\n args: {\n take: t.arg.int(),\n skip: t.arg.int(),\n },\n resolve: async (query, _root, args, ctx) =>\n ctx.db.test.findMany({\n ...query,\n take: args.take ?? 10,\n skip: args.skip ?? 0,\n orderBy: { createdAt: 'desc' },\n }),\n })\n);\n\n// Mutation\nbuilder.mutationField('createTest', (t) =>\n t.prismaField({\n type: 'Test',\n args: {\n input: t.arg({ type: CreateTestInput, required: true }),\n },\n resolve: async (query, _root, args, ctx) =>\n ctx.db.test.create({\n ...query,\n data: args.input,\n }),\n })\n);\n\\`\\`\\`\n\n### 4. Yoga Server (index.ts)\n\n\\`\\`\\`typescript\nimport { createYoga } from 'graphql-yoga';\nimport { builder } from './builder';\nimport './types/test'; // Import all type definitions\n\nexport const yoga = createYoga({\n schema: builder.toSchema(),\n graphqlEndpoint: '/graphql',\n});\n\\`\\`\\`\n\n### 5. Mount in Express (server.ts)\n\n\\`\\`\\`typescript\nimport express from 'express';\nimport { yoga } from './graphql';\n\nconst app = express();\n\n// GraphQL endpoint\napp.use('/graphql', yoga);\n\n// tRPC endpoint\napp.use('/trpc', trpcMiddleware);\n\\`\\`\\`\n\n## Client Setup\n\n### 1. GraphQL Client (shared/src/graphql/client.ts)\n\n\\`\\`\\`typescript\nimport { GraphQLClient } from 'graphql-request';\n\nlet client: GraphQLClient | null = null;\n\nexport function createGraphQLClient(config: { apiUrl: string }) {\n client = new GraphQLClient(config.apiUrl);\n return client;\n}\n\nexport function getGraphQLClient(): GraphQLClient {\n if (!client) throw new Error('GraphQL client not initialized');\n return client;\n}\n\nexport { gql } from 'graphql-request';\n\\`\\`\\`\n\n### 2. Using with React Query\n\n\\`\\`\\`typescript\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { getGraphQLClient, gql } from '../graphql/client';\n\nconst TESTS_QUERY = gql\\`\n query GetTests($take: Int) {\n tests(take: $take) {\n id\n name\n message\n }\n }\n\\`;\n\nconst CREATE_TEST = gql\\`\n mutation CreateTest($input: CreateTestInput!) {\n createTest(input: $input) {\n id\n name\n }\n }\n\\`;\n\n// Query hook\nconst { data, isLoading } = useQuery({\n queryKey: ['graphql', 'tests'],\n queryFn: () => getGraphQLClient().request(TESTS_QUERY, { take: 10 }),\n});\n\n// Mutation hook\nconst queryClient = useQueryClient();\nconst mutation = useMutation({\n mutationFn: (input) => getGraphQLClient().request(CREATE_TEST, { input }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['graphql', 'tests'] });\n },\n});\n\\`\\`\\`\n\n## GraphQL Playground\n\nAccess the GraphQL playground at:\n\\`\\`\\`\nhttp://localhost:3000/graphql\n\\`\\`\\`\n\nFeatures:\n- Schema explorer\n- Query autocompletion\n- Documentation browser\n- Query history\n\n## Best Practices\n\n1. **Use Input Types**: Always use input types for mutations\n2. **Pagination**: Implement cursor-based pagination for lists\n3. **Error Handling**: Use Pothos error types\n4. **Authorization**: Add auth checks in resolvers\n5. **N+1 Prevention**: Use Prisma's query optimization\n`,\n\n \"idealyst://framework/style-system\": `# Style Definition System\n\nIdealyst provides a powerful style definition system with build-time transformations via Babel plugin.\n\n## Overview\n\nThe style system provides:\n- **defineStyle()**: Define base styles for components\n- **extendStyle()**: Merge additional styles with base styles\n- **overrideStyle()**: Completely replace component styles\n- **$iterator pattern**: Expand styles for all theme keys\n\n## defineStyle()\n\nDefine base styles for a component:\n\n\\`\\`\\`typescript\nimport { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\n// Wrap theme for $iterator support\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\nexport const buttonStyles = defineStyle('Button', (theme: Theme) => ({\n button: {\n borderRadius: theme.radii.md,\n backgroundColor: theme.intents.primary.primary,\n\n variants: {\n size: {\n // $iterator expands to all size keys (xs, sm, md, lg, xl)\n paddingVertical: theme.sizes.$button.paddingVertical,\n paddingHorizontal: theme.sizes.$button.paddingHorizontal,\n },\n disabled: {\n true: { opacity: 0.5 },\n false: { opacity: 1 },\n },\n },\n },\n text: {\n color: theme.intents.primary.contrast,\n variants: {\n size: {\n fontSize: theme.sizes.$button.fontSize,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## Dynamic Style Functions\n\nFor styles depending on runtime props:\n\n\\`\\`\\`typescript\nexport const buttonStyles = defineStyle('Button', (theme: Theme) => ({\n button: ({ intent = 'primary', type = 'contained' }: ButtonDynamicProps) => ({\n backgroundColor: type === 'contained'\n ? theme.intents[intent].primary\n : 'transparent',\n borderColor: type === 'outlined'\n ? theme.intents[intent].primary\n : 'transparent',\n }),\n}));\n\\`\\`\\`\n\n## Using Styles in Components\n\n\\`\\`\\`typescript\nimport { buttonStyles } from './Button.styles';\n\nconst Button = ({ size = 'md', disabled = false, intent, type }) => {\n // Apply variants\n buttonStyles.useVariants({ size, disabled });\n\n // Static styles - no function call\n const staticStyle = buttonStyles.button;\n\n // Dynamic styles - function call with props\n const dynamicStyle = (buttonStyles.button as any)({ intent, type });\n\n return (\n <TouchableOpacity style={dynamicStyle}>\n <Text style={buttonStyles.text}>Click me</Text>\n </TouchableOpacity>\n );\n};\n\\`\\`\\`\n\n## extendStyle()\n\nMerge additional styles with base component styles:\n\n\\`\\`\\`typescript\n// style-extensions.ts\nimport { extendStyle } from '@idealyst/theme';\n\nextendStyle('Button', (theme) => ({\n button: {\n borderRadius: 9999, // Make all buttons pill-shaped\n },\n text: {\n fontFamily: 'CustomFont',\n },\n}));\n\\`\\`\\`\n\n## overrideStyle()\n\nCompletely replace component styles:\n\n\\`\\`\\`typescript\nimport { overrideStyle } from '@idealyst/theme';\n\noverrideStyle('Button', (theme) => ({\n button: {\n backgroundColor: theme.colors.surface.primary,\n borderWidth: 2,\n borderColor: theme.intents.primary.primary,\n },\n text: {\n color: theme.intents.primary.primary,\n },\n}));\n\\`\\`\\`\n\n## Import Order Matters\n\nExtensions must be imported **before** components:\n\n\\`\\`\\`typescript\n// App.tsx\nimport './style-extensions'; // FIRST - registers extensions\nimport { Button } from '@idealyst/components'; // SECOND - uses extensions\n\\`\\`\\`\n\n## When to Use Each\n\n| API | Use When |\n|-----|----------|\n| \\`defineStyle()\\` | Creating component library styles |\n| \\`extendStyle()\\` | Adding/modifying specific properties |\n| \\`overrideStyle()\\` | Completely custom styling |\n\n## See Also\n\n- \\`idealyst://framework/theming\\` - Theme builder API\n- \\`idealyst://framework/babel-plugin\\` - Plugin configuration\n- \\`idealyst://framework/iterator-pattern\\` - $iterator expansion\n`,\n\n \"idealyst://framework/babel-plugin\": `# Idealyst Babel Plugin\n\nThe Idealyst Babel plugin transforms style definitions at build time.\n\n## Installation\n\nThe plugin is included with \\`@idealyst/theme\\`.\n\n## Configuration\n\n\\`\\`\\`javascript\n// babel.config.js\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/theme/plugin', {\n // REQUIRED: Path to your theme file\n themePath: './src/theme/styles.ts',\n\n // Optional: Enable debug logging\n debug: false,\n verbose: false,\n\n // Optional: Paths to auto-process\n autoProcessPaths: [\n '@idealyst/components',\n '@idealyst/datepicker',\n 'src/',\n ],\n }],\n ],\n};\n\\`\\`\\`\n\n## What the Plugin Does\n\n### 1. Transforms defineStyle() to StyleSheet.create()\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Button', (theme) => ({\n button: { backgroundColor: theme.intents.primary.primary }\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n button: { backgroundColor: theme.intents.primary.primary }\n}));\n\\`\\`\\`\n\n### 2. Expands $iterator Patterns\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Button', (theme) => ({\n button: {\n variants: {\n size: {\n paddingVertical: theme.sizes.$button.paddingVertical,\n },\n },\n },\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n button: {\n variants: {\n size: {\n xs: { paddingVertical: theme.sizes.button.xs.paddingVertical },\n sm: { paddingVertical: theme.sizes.button.sm.paddingVertical },\n md: { paddingVertical: theme.sizes.button.md.paddingVertical },\n lg: { paddingVertical: theme.sizes.button.lg.paddingVertical },\n xl: { paddingVertical: theme.sizes.button.xl.paddingVertical },\n },\n },\n },\n}));\n\\`\\`\\`\n\n### 3. Merges Extensions at Build Time\n\n\\`\\`\\`typescript\n// Extension (processed first)\nextendStyle('Button', (theme) => ({\n button: { borderRadius: 9999 },\n}));\n\n// Base (merges with extension)\ndefineStyle('Button', (theme) => ({\n button: { padding: 16 },\n}));\n\n// Result: { padding: 16, borderRadius: 9999 }\n\\`\\`\\`\n\n### 4. Expands Color Iterators\n\n**Input:**\n\\`\\`\\`typescript\ndefineStyle('Screen', (theme) => ({\n screen: {\n variants: {\n background: {\n backgroundColor: theme.colors.$surface,\n },\n },\n },\n}));\n\\`\\`\\`\n\n**Output:**\n\\`\\`\\`typescript\nStyleSheet.create((theme) => ({\n screen: {\n variants: {\n background: {\n screen: { backgroundColor: theme.colors.surface.screen },\n primary: { backgroundColor: theme.colors.surface.primary },\n secondary: { backgroundColor: theme.colors.surface.secondary },\n // ... expands to all surface color keys\n },\n },\n },\n}));\n\\`\\`\\`\n\n### 5. Removes extendStyle/overrideStyle Calls\n\nAfter capturing extension definitions, the plugin removes the calls from the output since all merging happens at build time.\n\n## Theme Analysis\n\nThe plugin statically analyzes your theme file to extract:\n- Intent names (primary, success, error, etc.)\n- Size keys (xs, sm, md, lg, xl)\n- Radius names (none, sm, md, lg)\n- Shadow names (none, sm, md, lg, xl)\n- Surface color keys (screen, primary, secondary, etc.)\n- Text color keys (primary, secondary, inverse, etc.)\n- Border color keys (primary, secondary, disabled, etc.)\n\nThis enables $iterator expansion without runtime overhead.\n\n## Troubleshooting\n\n### Styles Not Applying\n\n1. Verify \\`themePath\\` points to your theme file\n2. Clear bundler cache: \\`yarn start --reset-cache\\`\n3. Check \\`void StyleSheet;\\` marker exists in style files\n\n### Theme Changes Not Detected\n\n1. Restart Metro bundler (theme is analyzed once)\n2. Verify theme exports correctly\n\n### Debug Mode\n\nEnable verbose logging:\n\n\\`\\`\\`javascript\n['@idealyst/theme/plugin', {\n themePath: './src/theme/styles.ts',\n verbose: true,\n}],\n\\`\\`\\`\n`,\n\n \"idealyst://framework/breakpoints\": `# Responsive Breakpoints\n\nIdealyst provides a responsive breakpoint system built on Unistyles v3, enabling width-based responsive styling across web and native platforms.\n\n## Default Breakpoints\n\nThe default themes include 5 breakpoints:\n\n| Breakpoint | Min Width | Target Devices |\n|------------|-----------|----------------|\n| \\`xs\\` | 0px | Portrait phones |\n| \\`sm\\` | 576px | Landscape phones |\n| \\`md\\` | 768px | Tablets |\n| \\`lg\\` | 992px | Desktops |\n| \\`xl\\` | 1200px | Large desktops |\n\n## Defining Breakpoints\n\n### Using setBreakpoints()\n\nSet all breakpoints at once:\n\n\\`\\`\\`typescript\nimport { createTheme } from '@idealyst/theme';\n\nconst theme = createTheme()\n // ... other theme config\n .setBreakpoints({\n xs: 0, // Must have one breakpoint at 0\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n })\n .build();\n\\`\\`\\`\n\n### Using addBreakpoint()\n\nAdd breakpoints individually:\n\n\\`\\`\\`typescript\nimport { fromTheme, lightTheme } from '@idealyst/theme';\n\nconst theme = fromTheme(lightTheme)\n .addBreakpoint('xxl', 1400) // Add extra large breakpoint\n .addBreakpoint('xxxl', 1800) // Add even larger\n .build();\n\\`\\`\\`\n\n## Using Breakpoints in Styles\n\n### In StyleSheet.create()\n\nUse object notation for responsive values:\n\n\\`\\`\\`typescript\nimport { StyleSheet } from 'react-native-unistyles';\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n // Responsive padding\n padding: {\n xs: 8,\n md: 16,\n xl: 24,\n },\n\n // Responsive flex direction\n flexDirection: {\n xs: 'column',\n md: 'row',\n },\n\n // Responsive gap\n gap: {\n xs: 8,\n sm: 12,\n lg: 16,\n },\n },\n\n text: {\n fontSize: {\n xs: 14,\n md: 16,\n lg: 18,\n },\n },\n}));\n\\`\\`\\`\n\n### Cascading Behavior\n\nValues cascade up - if a breakpoint isn't defined, it uses the nearest smaller one:\n\n\\`\\`\\`typescript\npadding: {\n xs: 8, // Used for xs, sm (no sm defined)\n md: 16, // Used for md, lg (no lg defined)\n xl: 24, // Used for xl\n}\n\\`\\`\\`\n\n## Runtime Utilities\n\n### getCurrentBreakpoint()\n\nGet the current active breakpoint:\n\n\\`\\`\\`typescript\nimport { getCurrentBreakpoint } from '@idealyst/theme';\n\nconst current = getCurrentBreakpoint();\nconsole.log(current); // 'md'\n\\`\\`\\`\n\n### getBreakpoints()\n\nGet all registered breakpoints:\n\n\\`\\`\\`typescript\nimport { getBreakpoints } from '@idealyst/theme';\n\nconst breakpoints = getBreakpoints();\n// { xs: 0, sm: 576, md: 768, lg: 992, xl: 1200 }\n\\`\\`\\`\n\n### isBreakpointUp() / isBreakpointDown()\n\nCheck viewport against breakpoints:\n\n\\`\\`\\`typescript\nimport { isBreakpointUp, isBreakpointDown } from '@idealyst/theme';\n\nif (isBreakpointUp('md')) {\n // Tablet or larger\n}\n\nif (isBreakpointDown('md')) {\n // Mobile only (below tablet)\n}\n\\`\\`\\`\n\n### resolveResponsive()\n\nResolve a responsive value for the current breakpoint:\n\n\\`\\`\\`typescript\nimport { resolveResponsive } from '@idealyst/theme';\n\nconst padding = resolveResponsive({ xs: 8, md: 16, xl: 24 });\n// Returns 8 on mobile, 16 on tablet, 24 on desktop\n\\`\\`\\`\n\n## Responsive Type\n\nThe \\`Responsive<T>\\` type makes any value responsive:\n\n\\`\\`\\`typescript\nimport { Responsive, Size } from '@idealyst/theme';\n\n// Can be either a direct value or breakpoint map\ntype Props = {\n size: Responsive<Size>;\n};\n\n// Both are valid:\n<Component size=\"md\" />\n<Component size={{ xs: 'sm', md: 'lg' }} />\n\\`\\`\\`\n\n### Type Guard\n\nCheck if a value is responsive:\n\n\\`\\`\\`typescript\nimport { isResponsiveValue, Responsive, Size } from '@idealyst/theme';\n\nfunction handleSize(size: Responsive<Size>) {\n if (isResponsiveValue(size)) {\n // size is Partial<Record<Breakpoint, Size>>\n console.log(size.xs, size.md);\n } else {\n // size is Size\n console.log(size);\n }\n}\n\\`\\`\\`\n\n## TypeScript Support\n\nCustom breakpoints are fully typed:\n\n\\`\\`\\`typescript\nconst theme = createTheme()\n .setBreakpoints({\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n })\n .build();\n\n// Register for type inference\ndeclare module '@idealyst/theme' {\n interface CustomThemeRegistry {\n theme: typeof theme;\n }\n}\n\n// Now Breakpoint = 'mobile' | 'tablet' | 'desktop'\nimport { Breakpoint } from '@idealyst/theme';\n\\`\\`\\`\n\n## Unistyles Integration\n\nBreakpoints are automatically registered with Unistyles:\n\n\\`\\`\\`typescript\nimport { UnistylesRegistry } from 'react-native-unistyles';\nimport { lightTheme, darkTheme } from '@idealyst/theme';\n\nUnistylesRegistry\n .addThemes({ light: lightTheme, dark: darkTheme })\n .addBreakpoints(lightTheme.breakpoints) // Register breakpoints\n .addConfig({ initialTheme: 'light' });\n\\`\\`\\`\n\n## Cross-Platform Behavior\n\n- **Web**: Breakpoints convert to CSS media queries automatically\n- **Native**: Uses device screen width (works with tablets, phones, etc.)\n- **Same API**: Write once, works everywhere\n\n## Best Practices\n\n1. **Mobile-first**: Start with \\`xs\\` and add larger breakpoints as needed\n2. **Use cascading**: Don't define every breakpoint - let values cascade\n3. **Consistent breakpoints**: Use the same breakpoints across themes\n4. **Test on devices**: Verify layouts on actual device widths\n5. **Avoid over-responsiveness**: Not everything needs to change per breakpoint\n`,\n\n \"idealyst://framework/iterator-pattern\": `# The $iterator Pattern\n\nThe \\`$iterator\\` pattern allows defining styles once that expand to all keys of a theme object.\n\n## ThemeStyleWrapper\n\nWrap your theme type to enable $iterator properties:\n\n\\`\\`\\`typescript\nimport { ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\\`\\`\\`\n\nThis adds \\`$property\\` versions of iterable theme properties:\n\n| Original Path | $iterator Path |\n|----------------------------|-----------------------------|\n| \\`theme.intents.primary\\` | \\`theme.$intents.primary\\` |\n| \\`theme.sizes.button.md\\` | \\`theme.sizes.$button.md\\` |\n| \\`theme.colors.surface.screen\\` | \\`theme.colors.$surface\\` |\n| \\`theme.colors.text.primary\\` | \\`theme.colors.$text\\` |\n| \\`theme.colors.border.primary\\` | \\`theme.colors.$border\\` |\n\n## Usage Examples\n\n### Expand Intents\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n intent: {\n backgroundColor: theme.$intents.light,\n borderColor: theme.$intents.primary,\n },\n}\n\n// Expands to all intent keys (primary, success, danger, warning, etc.)\n// Result:\n// intent: {\n// primary: { backgroundColor: theme.intents.primary.light, borderColor: theme.intents.primary.primary },\n// success: { backgroundColor: theme.intents.success.light, borderColor: theme.intents.success.primary },\n// danger: { ... },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Sizes\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n size: {\n paddingVertical: theme.sizes.$button.paddingVertical,\n fontSize: theme.sizes.$button.fontSize,\n },\n}\n\n// Expands to all size keys (xs, sm, md, lg, xl)\n// Result:\n// size: {\n// xs: { paddingVertical: theme.sizes.button.xs.paddingVertical, fontSize: theme.sizes.button.xs.fontSize },\n// sm: { paddingVertical: theme.sizes.button.sm.paddingVertical, fontSize: theme.sizes.button.sm.fontSize },\n// md: { ... },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Surface Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n background: {\n backgroundColor: theme.colors.$surface,\n },\n}\n\n// Expands to all surface color keys (screen, primary, secondary, tertiary, inverse, etc.)\n// Result:\n// background: {\n// screen: { backgroundColor: theme.colors.surface.screen },\n// primary: { backgroundColor: theme.colors.surface.primary },\n// secondary: { backgroundColor: theme.colors.surface.secondary },\n// tertiary: { backgroundColor: theme.colors.surface.tertiary },\n// inverse: { backgroundColor: theme.colors.surface.inverse },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Text Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n color: {\n color: theme.colors.$text,\n },\n}\n\n// Expands to all text color keys (primary, secondary, tertiary, inverse, etc.)\n// Result:\n// color: {\n// primary: { color: theme.colors.text.primary },\n// secondary: { color: theme.colors.text.secondary },\n// tertiary: { color: theme.colors.text.tertiary },\n// inverse: { color: theme.colors.text.inverse },\n// ...\n// }\n\\`\\`\\`\n\n### Expand Border Colors\n\n\\`\\`\\`typescript\n// Single definition\nvariants: {\n borderColor: {\n borderColor: theme.colors.$border,\n },\n}\n\n// Expands to all border color keys (primary, secondary, tertiary, disabled)\n// Result:\n// borderColor: {\n// primary: { borderColor: theme.colors.border.primary },\n// secondary: { borderColor: theme.colors.border.secondary },\n// tertiary: { borderColor: theme.colors.border.tertiary },\n// disabled: { borderColor: theme.colors.border.disabled },\n// }\n\\`\\`\\`\n\n## Complete Example\n\n\\`\\`\\`typescript\nimport { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';\nimport type { Theme as BaseTheme } from '@idealyst/theme';\n\ntype Theme = ThemeStyleWrapper<BaseTheme>;\n\nexport const chipStyles = defineStyle('Chip', (theme: Theme) => ({\n chip: {\n borderRadius: 999,\n\n variants: {\n // Expand for all sizes\n size: {\n paddingVertical: theme.sizes.$chip.paddingVertical,\n paddingHorizontal: theme.sizes.$chip.paddingHorizontal,\n minHeight: theme.sizes.$chip.minHeight,\n },\n\n // Expand for all intents\n intent: {\n backgroundColor: theme.$intents.light,\n borderColor: theme.$intents.primary,\n },\n },\n },\n\n text: {\n variants: {\n size: {\n fontSize: theme.sizes.$chip.fontSize,\n lineHeight: theme.sizes.$chip.lineHeight,\n },\n\n intent: {\n color: theme.$intents.dark,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## createIteratorStyles()\n\nAlternative to defineStyle for custom components:\n\n\\`\\`\\`typescript\nimport { createIteratorStyles } from '@idealyst/theme';\n\nexport const styles = createIteratorStyles((theme) => ({\n box: {\n variants: {\n intent: {\n backgroundColor: theme.$intents.light,\n },\n },\n },\n}));\n\\`\\`\\`\n\n## Supported Iterators\n\n| Iterator | Pattern | Expands To |\n|----------|---------|------------|\n| Intents | \\`theme.$intents.X\\` | All intent keys (primary, success, danger, etc.) |\n| Sizes | \\`theme.sizes.$component.X\\` | All size keys (xs, sm, md, lg, xl) |\n| Surface Colors | \\`theme.colors.$surface\\` | All surface color keys |\n| Text Colors | \\`theme.colors.$text\\` | All text color keys |\n| Border Colors | \\`theme.colors.$border\\` | All border color keys |\n\n## Benefits\n\n1. **DRY Code**: Define once, expand to many\n2. **Type Safety**: TypeScript validates iterator properties\n3. **Maintainable**: Adding new sizes/intents/colors to theme auto-expands\n4. **Zero Runtime Cost**: Expansion happens at build time\n`,\n};\n","export const navigationGuides: Record<string, string> = {\n \"idealyst://navigation/overview\": `# Navigation System Overview\n\nThe Idealyst navigation system provides a unified API for both React Native and web applications, handling routing seamlessly across platforms.\n\n## Core Concepts\n\n### Cross-Platform Routing\n- **Mobile (React Native)**: Uses React Navigation for native navigation patterns\n- **Web**: Uses React Router for browser-based routing\n- **Unified API**: Same code works on both platforms\n\n### Route Types\n\nThere are two fundamental route types:\n\n#### 1. Screen Routes\nRenders a component directly to the screen:\n\\`\\`\\`tsx\n{\n path: \"profile\",\n type: 'screen',\n component: ProfileScreen\n}\n\\`\\`\\`\n\n#### 2. Navigator Routes\nWraps child routes with navigation structure:\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'stack', // or 'tab', 'drawer', 'modal'\n routes: [\n { path: \"home\", type: 'screen', component: HomeScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n## Setup\n\n### Basic Setup\n\n\\`\\`\\`tsx\nimport { NavigatorProvider } from '@idealyst/navigation';\n\nfunction App() {\n return (\n <NavigatorProvider route={appRouter}>\n {/* Content managed by router */}\n </NavigatorProvider>\n );\n}\n\\`\\`\\`\n\n### Quick Start with Examples\n\nUse the pre-built example router for instant working navigation:\n\n\\`\\`\\`tsx\nimport { ExampleNavigationRouter } from '@idealyst/navigation/examples';\n\n<NavigatorProvider route={ExampleNavigationRouter} />\n\\`\\`\\`\n\nThe example router demonstrates:\n- Stack-based navigation structure\n- Custom web layouts with header and sidebar\n- Tab navigation for nested sections\n\n## Platform Differences\n\n### Mobile (React Native)\n- Stack navigator: Native stack navigation with animations\n- Tab navigator: Bottom tab bar\n- Drawer navigator: Side drawer with gestures\n- Modal navigator: Full-screen modal presentation\n\n### Web\n- Stack navigator: Browser history-based routing\n- Tab navigator: Top or side tab navigation\n- All navigators: Use URL paths for routing\n- Custom layouts: Can add headers, sidebars, footers\n\n## Key Features\n\n1. **Type-Safe Navigation**: Full TypeScript support\n2. **Path Parameters**: \\`/user/:id\\` support\n3. **Nested Routes**: Unlimited nesting depth\n4. **Custom Layouts**: Web-specific layout components\n5. **Theme Integration**: Works with @idealyst/theme\n6. **Cross-Platform**: Write once, run everywhere\n`,\n\n \"idealyst://navigation/route-configuration\": `# Route Configuration\n\nLearn how to define and structure routes in your Idealyst application.\n\n## Route Definition\n\n### Screen Route\n\nThe simplest route type - renders a component:\n\n\\`\\`\\`tsx\nimport { RouteParam } from '@idealyst/navigation';\n\nconst route: RouteParam = {\n path: \"profile\",\n type: 'screen',\n component: ProfileScreen,\n options: {\n title: \"User Profile\",\n headerShown: true\n }\n};\n\\`\\`\\`\n\n### Navigator Route\n\nA route that contains child routes:\n\n\\`\\`\\`tsx\nconst route: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n { path: \"home\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ],\n options: {\n headerShown: false\n }\n};\n\\`\\`\\`\n\n## Path Configuration\n\n### Basic Paths\n\n\\`\\`\\`tsx\n{ path: \"home\", ... } // Relative: /parent/home\n{ path: \"/home\", ... } // Absolute: /home\n{ path: \"\", ... } // Index route\n\\`\\`\\`\n\n### Path Parameters\n\n\\`\\`\\`tsx\n{\n path: \"user/:id\",\n type: 'screen',\n component: UserScreen\n}\n\n// Navigate with:\nnavigator.navigate({\n path: \"/user/:id\",\n vars: { id: \"123\" }\n});\n\n// Access in component:\nimport { useParams } from '@idealyst/navigation';\n\nconst params = useParams();\nconst userId = params.id;\n\\`\\`\\`\n\n### Optional Parameters\n\n\\`\\`\\`tsx\n{ path: \"search/:query?\" } // query is optional\n\\`\\`\\`\n\n## Screen Options\n\n### Common Options\n\n\\`\\`\\`tsx\ntype ScreenOptions = {\n title?: string; // Screen title\n headerShown?: boolean; // Show/hide header (mobile)\n};\n\\`\\`\\`\n\n### Tab-Specific Options\n\nFor tab navigators:\n\n\\`\\`\\`tsx\ntype TabBarScreenOptions = {\n tabBarIcon?: (props: {\n focused: boolean;\n color: string;\n size: string | number\n }) => React.ReactElement;\n\n tabBarLabel?: string; // Tab label\n tabBarBadge?: string | number; // Badge count\n tabBarVisible?: boolean; // Show/hide tab\n} & ScreenOptions;\n\\`\\`\\`\n\n> **Nested navigators:** When a Stack is nested inside a Tab, the **stack's root route** still uses \\`TabBarScreenOptions\\` for its \\`options\\` (it needs tabBarIcon/tabBarLabel for the tab bar). Type it as \\`options: TabBarScreenOptions\\` on the stack wrapper route.\n\nExample:\n\\`\\`\\`tsx\n{\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ focused, color }) => (\n <Icon name=\"home\" color={color} />\n ),\n tabBarBadge: 5\n }\n}\n\\`\\`\\`\n\n## Navigator Options\n\nOptions for navigator routes:\n\n\\`\\`\\`tsx\ntype NavigatorOptions = {\n headerTitle?: React.ComponentType | React.ReactElement | string;\n headerLeft?: React.ComponentType | React.ReactElement;\n headerBackVisible?: boolean;\n headerRight?: React.ComponentType | React.ReactElement;\n headerShown?: boolean;\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\n{\n path: \"/app\",\n type: 'navigator',\n layout: 'stack',\n routes: [...],\n options: {\n headerTitle: \"My App\",\n headerShown: true,\n headerRight: <UserMenu />\n }\n}\n\\`\\`\\`\n\n## Invalid Route Handling\n\nNavigators can specify how to handle invalid routes:\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\n\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => (\n <View>\n <Text>Page not found: {path}</Text>\n </View>\n);\n\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n // Component to show when route is invalid\n notFoundComponent: NotFoundPage,\n // Handler to redirect or show 404\n onInvalidRoute: (path) => {\n if (path.startsWith('/old-')) {\n return { path: '/new-section', replace: true };\n }\n return undefined; // Show notFoundComponent\n },\n routes: [...]\n};\n\\`\\`\\`\n\nSee the **Invalid Route Handling** guide for complete documentation.\n\n## Nested Routes\n\nCreate hierarchical navigation:\n\n\\`\\`\\`tsx\nconst appRouter: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n {\n path: \"dashboard\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n { path: \"overview\", type: 'screen', component: OverviewScreen },\n { path: \"analytics\", type: 'screen', component: AnalyticsScreen },\n { path: \"reports\", type: 'screen', component: ReportsScreen },\n ]\n },\n {\n path: \"settings\",\n type: 'screen',\n component: SettingsScreen\n },\n ]\n};\n\\`\\`\\`\n\n## Full Path Resolution\n\nFull paths are automatically computed:\n- \\`/dashboard/overview\\`\n- \\`/dashboard/analytics\\`\n- \\`/dashboard/reports\\`\n- \\`/settings\\`\n\n## Adding a New Screen to an Existing App\n\nWhen adding a new screen to a scaffolded project, you must complete ALL three steps:\n\n### Step 1: Create the screen component\n\\`\\`\\`tsx\n// packages/shared/src/screens/TodoListScreen.tsx\nimport { View, Text } from '@idealyst/components';\n\nexport function TodoListScreen() {\n return <View padding=\"md\"><Text typography=\"h5\">Todo List</Text></View>;\n}\n\\`\\`\\`\n\n### Step 2: Register in the route config\n\\`\\`\\`tsx\n// In your AppRouter.ts or route configuration file\nimport { TodoListScreen } from '../screens/TodoListScreen';\n\nconst appRouter: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"todos\", type: 'screen', component: TodoListScreen }, // Add this\n ]\n};\n\\`\\`\\`\n\n### Step 3: Navigate to the new screen\n\\`\\`\\`tsx\n// In any existing screen\nconst { navigate } = useNavigator();\n<Button onPress={() => navigate({ path: '/todos' })}>View Todos</Button>\n\\`\\`\\`\n\n> **CRITICAL:** A screen component that is NOT registered in the route config is unreachable. Writing a screen without adding it to routes is a common mistake.\n\n## Best Practices\n\n1. **Use relative paths** for child routes\n2. **Keep nesting shallow** (3 levels max recommended)\n3. **Group related screens** in navigators\n4. **Use meaningful paths** that reflect content\n5. **Define index routes** with empty path\n6. **Set appropriate options** for each screen type\n`,\n\n \"idealyst://navigation/navigator-types\": `# Navigator Types\n\nIdealyst supports four navigator types: stack, tab, drawer, and modal. Each provides different navigation patterns.\n\n## Stack Navigator\n\nLinear, hierarchical navigation - the most common pattern.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/app\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Native stack navigation with slide animations\n- Hardware back button support\n- Swipe-to-go-back gesture\n\n**Web:**\n- Browser history integration\n- URL updates on navigation\n- Back/forward browser buttons work\n\n### Use Cases\n- Main app navigation\n- Detail views\n- Settings flows\n- Onboarding sequences\n\n## Tab Navigator\n\nSection-based navigation with a tab bar.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n {\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ color }) => <Icon name=\"home\" color={color} />\n }\n },\n {\n path: \"search\",\n type: 'screen',\n component: SearchScreen,\n options: {\n tabBarLabel: \"Search\",\n tabBarIcon: ({ color }) => <Icon name=\"search\" color={color} />\n }\n },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Bottom tab bar\n- Tab icons and labels\n- Badge support\n- Active tab highlighting\n\n**Web:**\n- Top or side tabs\n- Can use custom layout component\n- URL-based tab switching\n\n### Use Cases\n- Main app sections\n- Content categories\n- Dashboard views\n- Multi-section interfaces\n\n## Drawer Navigator\n\nSide menu navigation, primarily for desktop/tablet.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'drawer',\n routes: [\n { path: \"dashboard\", type: 'screen', component: DashboardScreen },\n { path: \"users\", type: 'screen', component: UsersScreen },\n { path: \"settings\", type: 'screen', component: SettingsScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Slide-out drawer\n- Swipe gesture to open\n- Overlay when open\n\n**Web:**\n- Sidebar navigation\n- Can be persistent or overlay\n- Responsive behavior\n\n### Use Cases\n- Admin panels\n- Desktop applications\n- Content management systems\n- Multi-section apps\n\n## Modal Navigator\n\nOverlay navigation for temporary screens.\n\n### Configuration\n\n\\`\\`\\`tsx\n{\n path: \"/modals\",\n type: 'navigator',\n layout: 'modal',\n routes: [\n { path: \"new-post\", type: 'screen', component: NewPostScreen },\n { path: \"edit-profile\", type: 'screen', component: EditProfileScreen },\n ]\n}\n\\`\\`\\`\n\n### Platform Behavior\n\n**Mobile:**\n- Full-screen modal presentation\n- Slide-up animation\n- Close gesture support\n\n**Web:**\n- Overlay modal\n- Background dimming\n- Click-outside to close\n\n### Use Cases\n- Forms and data entry\n- Action confirmations\n- Image viewers\n- Temporary content\n\n## Combining Navigator Types\n\nNavigators can be nested for complex flows:\n\n\\`\\`\\`tsx\nconst appRouter: RouteParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n routes: [\n {\n path: \"main\",\n type: 'navigator',\n layout: 'tab',\n routes: [\n { path: \"feed\", type: 'screen', component: FeedScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n ]\n },\n {\n path: \"modals\",\n type: 'navigator',\n layout: 'modal',\n routes: [\n { path: \"create\", type: 'screen', component: CreateScreen },\n ]\n }\n ]\n};\n\\`\\`\\`\n\n## Choosing the Right Navigator\n\n| Navigator | Mobile | Desktop | Use Case |\n|-----------|--------|---------|----------|\n| **Stack** | ✅ Primary | ✅ Primary | Hierarchical navigation |\n| **Tab** | ✅ Primary | ✅ Secondary | Section-based navigation |\n| **Drawer** | ⚠️ Secondary | ✅ Primary | Menu-based navigation |\n| **Modal** | ✅ Common | ✅ Common | Temporary overlays |\n\n## Best Practices\n\n1. **Use stack for most flows** - It's the most universal pattern\n2. **Limit tab count** - 3-5 tabs maximum for mobile\n3. **Reserve drawers for complex apps** - Best on desktop\n4. **Use modals sparingly** - For focused, temporary tasks\n5. **Consider platform** - What works on mobile may not work on web\n6. **Test navigation flow** - Ensure intuitive user experience\n`,\n\n \"idealyst://navigation/custom-layouts\": `# Custom Layouts (Web Only)\n\nOn web, navigators can use custom layout components to add headers, sidebars, and other UI around route content.\n\n## GeneralLayout Component\n\nThe built-in \\`GeneralLayout\\` provides header and sidebar functionality:\n\n### Basic Usage\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\n\n<GeneralLayout\n header={{\n enabled: true,\n content: <Text>My App</Text>,\n }}\n sidebar={{\n enabled: true,\n content: <NavigationMenu />,\n }}\n>\n {children}\n</GeneralLayout>\n\\`\\`\\`\n\n### Header Configuration\n\n\\`\\`\\`tsx\ntype HeaderConfig = {\n enabled: boolean; // Show/hide header\n height?: number; // Header height (default: 64)\n content?: React.ReactNode; // Header content\n style?: ViewStyle; // Custom styles\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\nheader={{\n enabled: true,\n height: 80,\n content: (\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', padding: 16 }}>\n <Text typography=\"h6\" weight=\"bold\">Dashboard</Text>\n <UserMenu />\n </View>\n )\n}}\n\\`\\`\\`\n\n### Sidebar Configuration\n\n\\`\\`\\`tsx\ntype SidebarConfig = {\n enabled: boolean; // Show/hide sidebar\n collapsible?: boolean; // Allow collapse/expand\n position?: 'left' | 'right'; // Sidebar position\n initiallyExpanded?: boolean; // Initial state\n expandedWidth?: number; // Width when expanded (default: 240)\n collapsedWidth?: number; // Width when collapsed (default: 64)\n content?: React.ReactNode; // Sidebar content\n style?: ViewStyle; // Custom styles\n};\n\\`\\`\\`\n\nExample:\n\\`\\`\\`tsx\nsidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n initiallyExpanded: true,\n expandedWidth: 280,\n collapsedWidth: 72,\n content: <NavigationSidebar />\n}}\n\\`\\`\\`\n\n## Using Layouts with Navigators\n\n### Stack Navigator with Layout\n\n\\`\\`\\`tsx\nimport { CustomStackLayout } from './layouts/CustomStackLayout';\n\nconst router: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: CustomStackLayout, // Web only!\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n### Tab Navigator with Layout\n\n\\`\\`\\`tsx\nimport { CustomTabLayout } from './layouts/CustomTabLayout';\n\nconst router: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'tab',\n layoutComponent: CustomTabLayout, // Web only!\n routes: [\n { path: \"feed\", type: 'screen', component: FeedScreen },\n { path: \"profile\", type: 'screen', component: ProfileScreen },\n ]\n};\n\\`\\`\\`\n\n## Creating Custom Layouts\n\n### Stack Layout Component\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport const CustomStackLayout: React.FC<StackLayoutProps> = ({\n children,\n options,\n routes,\n currentPath\n}) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n content: (\n <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>\n <Text>{options?.headerTitle || 'My App'}</Text>\n {options?.headerRight}\n </View>\n )\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n content: (\n <NavigationMenu routes={routes} currentPath={currentPath} />\n )\n }}\n >\n {children}\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n### Tab Layout Component\n\n\\`\\`\\`tsx\nimport type { TabLayoutProps } from '@idealyst/navigation';\n\nexport const CustomTabLayout: React.FC<TabLayoutProps> = ({\n children,\n routes,\n currentPath\n}) => {\n const navigator = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Custom tab bar */}\n <View style={{ flexDirection: 'row', borderBottom: '1px solid #ccc' }}>\n {routes.map(route => (\n <Pressable\n key={route.path}\n onPress={() => navigator.navigate({ path: route.fullPath, vars: {} })}\n style={{\n padding: 16,\n borderBottom: currentPath === route.fullPath ? '2px solid blue' : 'none'\n }}\n >\n <Text>{route.options?.tabBarLabel || route.path}</Text>\n </Pressable>\n ))}\n </View>\n\n {/* Content */}\n <View style={{ flex: 1 }}>\n {children}\n </View>\n </View>\n );\n};\n\\`\\`\\`\n\n## Layout Props Reference\n\n### StackLayoutProps\n\n\\`\\`\\`tsx\ntype StackLayoutProps = {\n options?: NavigatorOptions; // Navigator options\n routes: RouteWithFullPath[]; // All routes with full paths\n currentPath: string; // Current active path\n children?: React.ReactNode; // Route content\n};\n\\`\\`\\`\n\n### TabLayoutProps\n\n\\`\\`\\`tsx\ntype TabLayoutProps = {\n options?: NavigatorOptions; // Navigator options\n routes: RouteWithFullPath<TabBarScreenOptions>[]; // Tab routes\n currentPath: string; // Current active path\n children?: React.ReactNode; // Route content\n};\n\\`\\`\\`\n\n## Real-World Examples\n\n### Dashboard Layout\n\n\\`\\`\\`tsx\nexport const DashboardLayout: React.FC<StackLayoutProps> = ({\n children,\n routes,\n currentPath\n}) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n height: 72,\n content: (\n <View style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16\n }}>\n <Text typography=\"h5\" weight=\"bold\">Dashboard</Text>\n <View style={{ flexDirection: 'row', gap: 16 }}>\n <NotificationBell />\n <UserAvatar />\n </View>\n </View>\n )\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n expandedWidth: 260,\n content: <DashboardSidebar routes={routes} currentPath={currentPath} />\n }}\n >\n {children}\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n### Admin Panel Layout\n\n\\`\\`\\`tsx\nexport const AdminLayout: React.FC<StackLayoutProps> = ({ children }) => {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n content: <AdminHeader />,\n style: { backgroundColor: '#1a1a1a', color: '#fff' }\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n position: 'left',\n initiallyExpanded: true,\n content: <AdminNavigationMenu />,\n style: { backgroundColor: '#2a2a2a' }\n }}\n >\n <View style={{ padding: 24 }}>\n {children}\n </View>\n </GeneralLayout>\n );\n};\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use GeneralLayout as base** - Don't reinvent header/sidebar logic\n2. **Keep layouts simple** - Complex logic belongs in screens\n3. **Make responsive** - Consider different screen sizes\n4. **Theme-aware** - Use theme colors and spacing\n5. **Accessible** - Ensure keyboard and screen reader support\n6. **Performance** - Memoize layout components when possible\n7. **Consistent** - Use same layout for similar sections\n\n## Platform Considerations\n\n- **Web only**: Layout components only apply to web\n- **Mobile**: Uses native navigation components\n- **Conditional rendering**: Check platform if needed\n- **Testing**: Test both platforms separately\n`,\n\n \"idealyst://navigation/use-navigator\": `# useNavigator Hook\n\nThe \\`useNavigator\\` hook provides navigation functionality and route information within your components.\n\n## Basic Usage\n\n\\`\\`\\`tsx\nimport { useNavigator } from '@idealyst/navigation';\n\nfunction MyComponent() {\n const navigator = useNavigator();\n\n return (\n <Button onPress={() => navigator.navigate({ path: '/profile', vars: {} })}>\n Go to Profile\n </Button>\n );\n}\n\\`\\`\\`\n\n## API Reference\n\n### navigator.navigate()\n\nNavigate to a route:\n\n\\`\\`\\`tsx\nnavigator.navigate({\n path: string;\n vars?: Record<string, string>;\n replace?: boolean; // Replace history entry instead of push\n});\n\\`\\`\\`\n\nExamples:\n\\`\\`\\`tsx\n// Simple navigation\nnavigator.navigate({ path: '/home' });\n\n// With path parameters\nnavigator.navigate({\n path: '/user/:id',\n vars: { id: '123' }\n});\n\n// With query parameters\nnavigator.navigate({\n path: '/search',\n vars: { q: 'react', category: 'tutorial' }\n});\n\n// Replace current history entry (no back navigation to current page)\nnavigator.navigate({\n path: '/dashboard',\n replace: true\n});\n\\`\\`\\`\n\n### Replace vs Push Navigation\n\nBy default, navigation pushes a new entry onto the history stack. Use \\`replace: true\\` when you want to replace the current entry instead:\n\n\\`\\`\\`tsx\n// After login, replace login page in history\nnavigator.navigate({ path: '/dashboard', replace: true });\n\n// Redirect without adding to history\nnavigator.navigate({ path: '/new-location', replace: true });\n\\`\\`\\`\n\n**Use cases for replace:**\n- Post-login redirects (user shouldn't go back to login)\n- After form submission redirects\n- URL canonicalization/normalization\n- Redirect from deprecated routes\n\n## useParams Hook\n\nAccess current route path parameters. Returns \\`Record<string, string>\\`.\n\n> **WARNING:** \\`useParams()\\` does NOT accept generic type arguments. Do NOT write \\`useParams<{ id: string }>()\\` — this causes TS2558. Access params by key from the returned record instead.\n\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\nfunction UserScreen() {\n // CORRECT — no type argument\n const params = useParams();\n const userId = params.id; // Path param from /user/:id\n\n // WRONG — useParams does NOT accept generics\n // const params = useParams<{ id: string }>(); // TS2558 error!\n\n return <Text>User ID: {userId}</Text>;\n}\n\\`\\`\\`\n\n## useNavigationState Hook\n\nAccess navigation state passed via the \\`state\\` property:\n\n\\`\\`\\`tsx\nimport { useNavigationState } from '@idealyst/navigation';\n\n// When navigating:\nnavigator.navigate({\n path: '/recording',\n state: { autostart: true, source: 'home' }\n});\n\n// In destination screen:\nfunction RecordingScreen() {\n const { autostart, source } = useNavigationState<{\n autostart?: boolean;\n source?: string;\n }>();\n\n // autostart = true, source = 'home'\n}\n\\`\\`\\`\n\n### Consuming State (Web)\n\nRemove state from URL after reading:\n\n\\`\\`\\`tsx\n// URL: /recording?autostart=true\nconst { autostart } = useNavigationState<{ autostart?: boolean }>({\n consume: ['autostart']\n});\n// autostart = true, URL becomes: /recording (param removed)\n\\`\\`\\`\n\n## useLocation (React Router)\n\nGet the current route path on web:\n\n\\`\\`\\`tsx\nimport { useLocation } from '@idealyst/navigation';\n\nfunction MyComponent() {\n const location = useLocation();\n console.log(location.pathname); // \"/user/123\"\n}\n\\`\\`\\`\n\n### navigator.canGoBack()\n\nCheck if back navigation is available:\n\n\\`\\`\\`tsx\nconst navigator = useNavigator();\n\nif (navigator.canGoBack()) {\n // Show back button\n}\n\\`\\`\\`\n\n**Platform behavior:**\n- **Web**: Returns \\`true\\` if there's a valid parent route in the route hierarchy (e.g., \\`/users/123\\` can go back to \\`/users\\`)\n- **Native**: Uses React Navigation's \\`canGoBack()\\` to check navigation stack\n\n### navigator.goBack()\n\nNavigate back in the route hierarchy:\n\n\\`\\`\\`tsx\n<Button onPress={() => navigator.goBack()}>\n Go Back\n</Button>\n\\`\\`\\`\n\n**Platform behavior:**\n- **Web**: Navigates to the parent route (e.g., \\`/users/123/edit\\` → \\`/users/123\\` → \\`/users\\` → \\`/\\`). Does NOT use browser history - navigates up the route tree.\n- **Native**: Uses React Navigation's \\`goBack()\\` to pop the navigation stack\n\n**Important**: On web, this is NOT browser history back. It navigates to the parent path in the route hierarchy. Use this for \"up\" navigation within your app structure.\n\n## Path Parameters\n\n### Defining Parameters\n\nIn route configuration:\n\\`\\`\\`tsx\n{\n path: \"user/:id\",\n type: 'screen',\n component: UserScreen\n}\n\\`\\`\\`\n\n### Accessing Parameters\n\nIn the screen component:\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\nfunction UserScreen() {\n const params = useParams();\n const userId = params.id;\n\n return <Text>User ID: {userId}</Text>;\n}\n\\`\\`\\`\n\n### Multiple Parameters\n\n\\`\\`\\`tsx\nimport { useParams } from '@idealyst/navigation';\n\n// Route: \"post/:postId/comment/:commentId\"\n\n// Navigate:\nnavigator.navigate({\n path: '/post/:postId/comment/:commentId',\n vars: { postId: '42', commentId: '7' }\n});\n\n// Access:\nconst params = useParams();\nconst postId = params.postId;\nconst commentId = params.commentId;\n\\`\\`\\`\n\n## Query Parameters\n\n### Passing Query Params\n\n\\`\\`\\`tsx\nnavigator.navigate({\n path: '/search',\n vars: {\n q: 'typescript',\n category: 'tutorial',\n sort: 'recent'\n }\n});\n\n// Results in: /search?q=typescript&category=tutorial&sort=recent\n\\`\\`\\`\n\n### Reading Query Params\n\n\\`\\`\\`tsx\nimport { useNavigationState } from '@idealyst/navigation';\n\nfunction SearchScreen() {\n // Query params are accessed via useNavigationState on web\n const { q, category, sort } = useNavigationState<{\n q?: string;\n category?: string;\n sort?: string;\n }>();\n\n // Use params...\n}\n\\`\\`\\`\n\n## Navigation Patterns\n\n### Programmatic Navigation\n\nNavigate based on conditions:\n\n\\`\\`\\`tsx\nfunction LoginScreen() {\n const navigator = useNavigator();\n\n const handleLogin = async () => {\n const success = await login(credentials);\n\n if (success) {\n navigator.navigate({ path: '/dashboard', vars: {} });\n }\n };\n\n return <Button onPress={handleLogin}>Login</Button>;\n}\n\\`\\`\\`\n\n### Navigation with Data\n\nPass data through navigation:\n\n\\`\\`\\`tsx\n// List screen\n<Button onPress={() => {\n navigator.navigate({\n path: '/product/:id',\n vars: { id: product.id }\n });\n}}>\n View Product\n</Button>\n\n// Detail screen\nfunction ProductScreen() {\n const params = useParams();\n const productId = params.id;\n\n const product = useProduct(productId);\n // Render product...\n}\n\\`\\`\\`\n\n### Conditional Navigation\n\nNavigate based on user state:\n\n\\`\\`\\`tsx\nfunction ProtectedScreen() {\n const navigator = useNavigator();\n const { user } = useAuth();\n\n useEffect(() => {\n if (!user) {\n navigator.navigate({ path: '/login', vars: {} });\n }\n }, [user]);\n\n return user ? <Content /> : null;\n}\n\\`\\`\\`\n\n## Advanced Usage\n\n### Navigation Guards\n\n\\`\\`\\`tsx\nimport { useNavigator, useLocation } from '@idealyst/navigation';\n\nfunction useAuthGuard() {\n const { navigate } = useNavigator();\n const location = useLocation();\n const { isAuthenticated } = useAuth();\n\n useEffect(() => {\n if (!isAuthenticated && location.pathname !== '/login') {\n navigate({ path: '/login' });\n }\n }, [isAuthenticated, location.pathname]);\n}\n\nfunction App() {\n useAuthGuard();\n return <AppContent />;\n}\n\\`\\`\\`\n\n### Deep Linking\n\nHandle deep links:\n\n\\`\\`\\`tsx\nuseEffect(() => {\n const handleDeepLink = (url: string) => {\n // Parse URL and navigate\n const path = parseDeepLink(url);\n navigator.navigate({ path, vars: {} });\n };\n\n // Add deep link listener\n const subscription = Linking.addEventListener('url', ({ url }) => {\n handleDeepLink(url);\n });\n\n return () => subscription.remove();\n}, []);\n\\`\\`\\`\n\n### Navigation History\n\nTrack navigation history:\n\n\\`\\`\\`tsx\nimport { useLocation } from '@idealyst/navigation';\n\nfunction useNavigationHistory() {\n const location = useLocation();\n const [history, setHistory] = useState<string[]>([]);\n\n useEffect(() => {\n setHistory(prev => [...prev, location.pathname]);\n }, [location.pathname]);\n\n return history;\n}\n\\`\\`\\`\n\n## TypeScript Support\n\nType-safe navigation:\n\n\\`\\`\\`tsx\ntype NavigateParams = {\n path: string;\n vars: Record<string, string>;\n};\n\n// Strongly typed vars\ntype UserRouteVars = {\n id: string;\n tab?: 'posts' | 'comments' | 'likes';\n};\n\n// Usage\nnavigator.navigate({\n path: '/user/:id',\n vars: { id: '123', tab: 'posts' } as UserRouteVars\n});\n\\`\\`\\`\n\n## Platform Differences\n\n### React Native\n- \\`canGoBack()\\` checks React Navigation stack\n- \\`goBack()\\` uses native navigation stack\n- Hardware back button supported\n- Gesture-based navigation\n\n### Web\n- \\`canGoBack()\\` checks for valid parent route in hierarchy\n- \\`goBack()\\` navigates to parent route (NOT browser history)\n- Browser back/forward buttons still work for browser history\n- URL updates automatically\n- Bookmarkable URLs\n\n## Best Practices\n\n1. **Always provide vars** - Even if empty: \\`{}\\`\n2. **Type your routes** - Use TypeScript for safety\n3. **Handle errors** - Check if navigation succeeded\n4. **Avoid navigation in render** - Use effects or handlers\n5. **Clean up listeners** - Remove event listeners on unmount\n6. **Test navigation flow** - Verify all paths work\n7. **Use path params for IDs** - Not query params\n8. **Use query params for filters** - Not path params\n\n## Common Patterns\n\n### Back Navigation\n\n\\`\\`\\`tsx\n// Conditionally show back button\nconst { canGoBack, goBack } = useNavigator();\n\n{canGoBack() && (\n <Button\n leftIcon=\"arrow-left\"\n onPress={goBack}\n >\n Back\n </Button>\n)}\n\\`\\`\\`\n\n### Tab Navigation\n\n\\`\\`\\`tsx\nimport { useNavigator, useLocation } from '@idealyst/navigation';\n\nconst tabs = ['feed', 'search', 'profile'];\n\nfunction TabBar() {\n const { navigate } = useNavigator();\n const location = useLocation();\n\n return (\n <View>\n {tabs.map(tab => (\n <Button\n key={tab}\n onPress={() => navigate({ path: \\`/\\${tab}\\` })}\n type={location.pathname === \\`/\\${tab}\\` ? 'contained' : 'outlined'}\n >\n {tab}\n </Button>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n### Modal Navigation\n\n\\`\\`\\`tsx\n<Button onPress={() => {\n navigator.navigate({\n path: '/modal/create-post',\n vars: {}\n });\n}}>\n Create Post\n</Button>\n\n// In modal:\n<Button onPress={() => navigator.goBack()}>\n Close\n</Button>\n\\`\\`\\`\n`,\n\n \"idealyst://navigation/invalid-route-handling\": `# Invalid Route Handling\n\nHandle 404 pages and invalid routes with customizable redirect logic and fallback components.\n\n## Overview\n\nThe navigation system provides two mechanisms for handling invalid routes:\n\n1. **\\`onInvalidRoute\\`** - A handler function that can redirect to a different route\n2. **\\`notFoundComponent\\`** - A fallback component to render when no redirect is specified\n\nThese can be configured at each navigator level and support bubbling up to parent navigators.\n\n## Basic Setup\n\n### Adding a 404 Page\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\n\n// 404 Component receives path and params\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => (\n <Screen>\n <View style={{ alignItems: 'center', padding: 24 }}>\n <Icon name=\"alert-circle\" size=\"xl\" intent=\"danger\" />\n <Text typography=\"h5\">Page Not Found</Text>\n <Text color=\"secondary\">The path \"{path}\" doesn't exist.</Text>\n {params && Object.keys(params).length > 0 && (\n <Text typography=\"caption\">Params: {JSON.stringify(params)}</Text>\n )}\n </View>\n </Screen>\n);\n\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: NotFoundPage,\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n## NotFoundComponentProps\n\nThe 404 component receives information about the attempted route:\n\n\\`\\`\\`tsx\ntype NotFoundComponentProps = {\n /** The full path that was attempted */\n path: string;\n /** Any route parameters that were parsed from the path */\n params?: Record<string, string>;\n};\n\\`\\`\\`\n\nExample usage:\n\\`\\`\\`tsx\nconst NotFoundPage = ({ path, params }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View style={{ padding: 16, gap: 24 }}>\n <Text typography=\"h5\">404 - Page Not Found</Text>\n <Text>Attempted: {path}</Text>\n {params?.id && <Text>User ID: {params.id}</Text>}\n <Button onPress={() => navigate({ path: '/', replace: true })}>\n Go Home\n </Button>\n </View>\n </Screen>\n );\n};\n\\`\\`\\`\n\n## Redirect Handler\n\nUse \\`onInvalidRoute\\` to redirect certain invalid paths:\n\n\\`\\`\\`tsx\nconst routes: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: NotFoundPage,\n onInvalidRoute: (invalidPath) => {\n // Redirect old URLs to new locations\n if (invalidPath.startsWith('/old-blog')) {\n return { path: '/blog', replace: true };\n }\n\n // Redirect legacy paths\n if (invalidPath === '/legacy-dashboard') {\n return { path: '/dashboard', replace: true };\n }\n\n // Return undefined to show notFoundComponent\n return undefined;\n },\n routes: [...]\n};\n\\`\\`\\`\n\n### Handler Return Values\n\nThe \\`onInvalidRoute\\` handler can return:\n\n- **\\`NavigateParams\\`** - Redirect to a different route\n- **\\`undefined\\`** - Show the \\`notFoundComponent\\` (or bubble up)\n\n\\`\\`\\`tsx\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean; // Recommended: true for redirects\n};\n\nonInvalidRoute: (path: string) => NavigateParams | undefined\n\\`\\`\\`\n\n## Scoped Handlers (Nested Navigators)\n\nEach navigator can have its own 404 handling:\n\n\\`\\`\\`tsx\n// Settings-specific 404 page\nconst SettingsNotFound = ({ path }: NotFoundComponentProps) => (\n <Screen>\n <View style={{ alignItems: 'center' }}>\n <Icon name=\"cog-off\" size=\"lg\" intent=\"warning\" />\n <Text>Settings page not found: {path}</Text>\n </View>\n </Screen>\n);\n\n// Nested settings navigator with its own handler\nconst SettingsNavigator: NavigatorParam = {\n path: \"settings\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: SettingsNotFound,\n onInvalidRoute: (path) => {\n // Redirect deprecated settings paths\n if (path.includes('legacy-setting')) {\n return { path: '/settings/general', replace: true };\n }\n return undefined; // Show SettingsNotFound\n },\n routes: [\n { path: \"\", type: 'screen', component: SettingsHome },\n { path: \"general\", type: 'screen', component: GeneralSettings },\n { path: \"account\", type: 'screen', component: AccountSettings },\n ]\n};\n\n// Root navigator with global 404\nconst AppRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: GlobalNotFound, // Fallback for non-settings routes\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n SettingsNavigator, // Has its own 404 handling\n { path: \"about\", type: 'screen', component: AboutScreen },\n ]\n};\n\\`\\`\\`\n\n## Handler Bubbling\n\nInvalid routes bubble up through the navigator hierarchy:\n\n\\`\\`\\`\nInvalid route detected: /settings/invalid-page\n ↓\nCheck /settings navigator's onInvalidRoute\n ↓\n┌─────────────────────────────────────────┐\n│ Returns NavigateParams? │\n│ YES → Redirect to that route │\n│ NO (undefined) → Check notFoundComponent │\n└─────────────────────────────────────────┘\n ↓\nHas notFoundComponent?\n YES → Render it with { path, params }\n NO → Bubble up to parent navigator\n ↓\nNo parent handles it?\n → console.warn(\"No handler for invalid route\")\n\\`\\`\\`\n\n## Platform Behavior\n\n### Web\n\n- Invalid routes trigger the catch-all route at each navigator level\n- The \\`onInvalidRoute\\` handler is called when the 404 route is rendered\n- If handler returns \\`NavigateParams\\`, navigation uses \\`replace: true\\` by default\n- URL stays at the invalid path when showing \\`notFoundComponent\\`\n\n### Mobile (React Native)\n\n- Invalid routes trigger navigation to a hidden 404 screen\n- The handler is called during the \\`navigate()\\` function\n- If handler returns \\`NavigateParams\\`, redirects to that route\n- If no handler/component, logs a warning\n\n## Complete Example\n\n\\`\\`\\`tsx\nimport { NavigatorParam, NotFoundComponentProps } from '@idealyst/navigation';\nimport { Screen, View, Text, Button, Icon, Card } from '@idealyst/components';\n\n// Global 404 - detailed error page\nconst GlobalNotFound = ({ path, params }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View style={{ padding: 24, gap: 24, alignItems: 'center', flex: 1, justifyContent: 'center' }}>\n <Icon name=\"alert-circle-outline\" size=\"xl\" intent=\"danger\" />\n <Text typography=\"h5\" weight=\"bold\">Page Not Found</Text>\n <Text color=\"secondary\">The page you're looking for doesn't exist.</Text>\n\n <Card style={{ marginTop: 16, padding: 16 }}>\n <Text typography=\"caption\" weight=\"semibold\">Attempted path:</Text>\n <Text typography=\"caption\" color=\"secondary\">{path}</Text>\n {params && Object.keys(params).length > 0 && (\n <>\n <Text typography=\"caption\" weight=\"semibold\" style={{ marginTop: 8 }}>Params:</Text>\n <Text typography=\"caption\" color=\"secondary\">{JSON.stringify(params)}</Text>\n </>\n )}\n </Card>\n\n <Button style={{ marginTop: 24 }} onPress={() => navigate({ path: '/', replace: true })}>\n Go Home\n </Button>\n </View>\n </Screen>\n );\n};\n\n// Admin section 404 - simpler style\nconst AdminNotFound = ({ path }: NotFoundComponentProps) => {\n const { navigate } = useNavigator();\n\n return (\n <Screen>\n <View padding=\"md\" style={{ alignItems: 'center' }}>\n <Icon name=\"shield-off\" size=\"lg\" intent=\"warning\" />\n <Text typography=\"h6\">Admin page not found</Text>\n <Button\n type=\"outlined\"\n size=\"sm\"\n onPress={() => navigate({ path: '/admin', replace: true })}\n >\n Back to Admin\n </Button>\n </View>\n </Screen>\n );\n};\n\n// Admin navigator with redirect logic\nconst AdminNavigator: NavigatorParam = {\n path: \"admin\",\n type: 'navigator',\n layout: 'stack',\n notFoundComponent: AdminNotFound,\n onInvalidRoute: (path) => {\n // Redirect old admin paths\n if (path.includes('old-users')) {\n return { path: '/admin/users', replace: true };\n }\n if (path.includes('deprecated')) {\n return { path: '/admin', replace: true };\n }\n return undefined; // Show AdminNotFound\n },\n routes: [\n { path: \"\", type: 'screen', component: AdminDashboard },\n { path: \"users\", type: 'screen', component: AdminUsers },\n { path: \"settings\", type: 'screen', component: AdminSettings },\n ]\n};\n\n// Root app router\nconst AppRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'drawer',\n notFoundComponent: GlobalNotFound,\n onInvalidRoute: (path) => {\n // Global redirects\n if (path === '/home') {\n return { path: '/', replace: true };\n }\n return undefined;\n },\n routes: [\n { path: \"\", type: 'screen', component: HomeScreen },\n AdminNavigator,\n { path: \"about\", type: 'screen', component: AboutScreen },\n { path: \"contact\", type: 'screen', component: ContactScreen },\n ]\n};\n\nexport default AppRouter;\n\\`\\`\\`\n\n## Best Practices\n\n1. **Always provide a root notFoundComponent** - Ensures all invalid routes are handled\n2. **Use scoped handlers for sections** - Different 404 styles for different app areas\n3. **Redirect deprecated URLs** - Use \\`onInvalidRoute\\` to maintain URL compatibility\n4. **Include helpful information** - Show the attempted path and suggest alternatives\n5. **Provide navigation options** - Add buttons to go home or back\n6. **Use \\`replace: true\\` for redirects** - Prevents invalid routes in browser history\n7. **Log unhandled routes** - Monitor for missing pages in production\n\n## TypeScript Types\n\n\\`\\`\\`tsx\nimport {\n NavigatorParam,\n NotFoundComponentProps,\n NavigateParams\n} from '@idealyst/navigation';\n\n// NotFoundComponentProps\ntype NotFoundComponentProps = {\n path: string;\n params?: Record<string, string>;\n};\n\n// Handler signature\ntype InvalidRouteHandler = (invalidPath: string) => NavigateParams | undefined;\n\n// NavigateParams (used by handler return and navigate function)\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean;\n};\n\\`\\`\\`\n`,\n\n \"idealyst://navigation/web-mobile-parity\": `# Web/Mobile Navigation Parity\n\nUnderstanding how to achieve the same navigation experience on web that you get for free on mobile.\n\n## The Core Problem\n\nOn **React Native**, you get native navigation UI for free:\n- Stack navigator gives you headers with back buttons\n- Tab navigator gives you a bottom tab bar with icons\n- Drawer navigator gives you a slide-out menu\n\nOn **Web**, you get nothing but URL routing. No headers, no tab bars, no drawers. You must build these yourself using **layout components**.\n\n## The Solution: Layout Components\n\nThe \\`layoutComponent\\` prop on navigators is how you achieve parity. It wraps your route content and provides the navigation UI.\n\n\\`\\`\\`tsx\n{\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: MyStackLayout, // <-- This is the key!\n routes: [...]\n}\n\\`\\`\\`\n\n## What Layout Components Receive\n\nEvery layout component receives these props:\n\n\\`\\`\\`tsx\ntype LayoutProps = {\n children: React.ReactNode; // The route content (renders via <Outlet />)\n options?: NavigatorOptions; // headerTitle, headerLeft, headerRight, etc.\n routes: RouteWithFullPath[]; // All child routes with their full paths\n currentPath: string; // Currently active route path\n};\n\\`\\`\\`\n\n**This gives you everything you need to build any navigation UI:**\n- \\`options\\` - What to show in headers\n- \\`routes\\` - What tabs/menu items to render\n- \\`currentPath\\` - Which one is active\n- \\`children\\` - Where to render the screen content\n\n## Stack Navigator Parity\n\n### What Native Gives You\n- Header bar with title\n- Back button (automatic)\n- Right-side actions\n- Smooth transitions\n\n### Web Implementation\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, IconButton, Pressable } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport function StackLayout({ options, currentPath }: StackLayoutProps) {\n const { canGoBack, goBack } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Header - mimics native stack header */}\n {options?.headerShown !== false && (\n <View style={{\n height: 56,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n borderBottomWidth: 1,\n borderBottomColor: '#e0e0e0',\n backgroundColor: '#fff',\n }}>\n {/* Back button - like native */}\n {options?.headerBackVisible !== false && canGoBack() && (\n <IconButton\n icon=\"arrow-left\"\n onPress={goBack}\n style={{ marginRight: 8 }}\n />\n )}\n\n {/* Left slot */}\n {options?.headerLeft && (\n <View style={{ marginRight: 16 }}>\n {typeof options.headerLeft === 'function'\n ? options.headerLeft({})\n : options.headerLeft}\n </View>\n )}\n\n {/* Title - centered or left-aligned */}\n <View style={{ flex: 1 }}>\n {typeof options?.headerTitle === 'string' ? (\n <Text typography=\"h6\" weight=\"bold\">{options.headerTitle}</Text>\n ) : (\n options?.headerTitle\n )}\n </View>\n\n {/* Right slot */}\n {options?.headerRight && (\n <View>\n {typeof options.headerRight === 'function'\n ? options.headerRight({})\n : options.headerRight}\n </View>\n )}\n </View>\n )}\n\n {/* Content area */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Tab Navigator Parity\n\n### What Native Gives You\n- Bottom tab bar\n- Icons for each tab\n- Labels\n- Badge counts\n- Active state highlighting\n\n### Web Implementation\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon, Badge } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { TabLayoutProps } from '@idealyst/navigation';\n\nexport function TabLayout({ routes, currentPath }: TabLayoutProps) {\n const { navigate } = useNavigator();\n\n return (\n <View style={{ flex: 1 }}>\n {/* Content area */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n\n {/* Bottom tab bar - mimics native */}\n <View style={{\n height: 56,\n flexDirection: 'row',\n borderTopWidth: 1,\n borderTopColor: '#e0e0e0',\n backgroundColor: '#fff',\n }}>\n {routes.map((route) => {\n const isActive = currentPath === route.fullPath;\n const options = route.options;\n\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n }}\n >\n {/* Icon with optional badge */}\n <View style={{ position: 'relative' }}>\n {options?.tabBarIcon?.({\n focused: isActive,\n color: isActive ? '#007AFF' : '#8E8E93',\n size: 24,\n })}\n {options?.tabBarBadge && (\n <Badge\n style={{ position: 'absolute', top: -4, right: -8 }}\n >\n {options.tabBarBadge}\n </Badge>\n )}\n </View>\n\n {/* Label */}\n {options?.tabBarLabel && (\n <Text\n typography=\"caption\"\n style={{\n marginTop: 4,\n color: isActive ? '#007AFF' : '#8E8E93',\n }}\n >\n {options.tabBarLabel}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Drawer Navigator Parity\n\n### What Native Gives You\n- Slide-out drawer from edge\n- Overlay when open\n- Gesture to open/close\n- Menu items\n\n### Web Implementation\n\nOn web, drawers are typically persistent sidebars. Here's how to build both:\n\n\\`\\`\\`tsx\nimport { Outlet } from 'react-router-dom';\nimport { View, Text, Pressable, Icon } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\nimport type { StackLayoutProps } from '@idealyst/navigation';\n\nexport function DrawerLayout({ routes, currentPath, options }: StackLayoutProps) {\n const { navigate } = useNavigator();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n {/* Sidebar - always visible on web */}\n <View style={{\n width: isCollapsed ? 64 : 240,\n borderRightWidth: 1,\n borderRightColor: '#e0e0e0',\n backgroundColor: '#f8f8f8',\n transition: 'width 0.2s',\n }}>\n {/* Logo/Header */}\n <View style={{ height: 56, justifyContent: 'center', paddingHorizontal: 16 }}>\n {!isCollapsed && <Text typography=\"h6\" weight=\"bold\">My App</Text>}\n </View>\n\n {/* Menu Items */}\n {routes.map((route) => {\n const isActive = currentPath.startsWith(route.fullPath);\n return (\n <Pressable\n key={route.fullPath}\n onPress={() => navigate({ path: route.fullPath })}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 12,\n backgroundColor: isActive ? 'rgba(0,0,0,0.08)' : 'transparent',\n }}\n >\n <Icon\n name={route.options?.icon || 'circle'}\n size={24}\n color={isActive ? '#007AFF' : '#666'}\n />\n {!isCollapsed && (\n <Text style={{ marginLeft: 12, color: isActive ? '#007AFF' : '#333' }}>\n {route.options?.title || route.path}\n </Text>\n )}\n </Pressable>\n );\n })}\n\n {/* Collapse toggle */}\n <Pressable\n onPress={() => setIsCollapsed(!isCollapsed)}\n style={{ padding: 12, marginTop: 'auto' }}\n >\n <Icon name={isCollapsed ? 'chevron-right' : 'chevron-left'} size=\"sm\" />\n </Pressable>\n </View>\n\n {/* Content */}\n <View style={{ flex: 1 }}>\n <Outlet />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Using GeneralLayout Helper\n\nThe \\`GeneralLayout\\` component simplifies building layouts:\n\n\\`\\`\\`tsx\nimport { GeneralLayout } from '@idealyst/navigation';\n\nexport function AppLayout({ options, routes, currentPath, children }: StackLayoutProps) {\n return (\n <GeneralLayout\n header={{\n enabled: true,\n height: 56,\n content: (\n <View style={{ flexDirection: 'row', alignItems: 'center', flex: 1 }}>\n <Text typography=\"h6\" weight=\"bold\">{options?.headerTitle || 'App'}</Text>\n <View style={{ marginLeft: 'auto' }}>{options?.headerRight}</View>\n </View>\n ),\n }}\n sidebar={{\n enabled: true,\n collapsible: true,\n expandedWidth: 240,\n collapsedWidth: 64,\n content: <SidebarMenu routes={routes} currentPath={currentPath} />,\n }}\n >\n {children}\n </GeneralLayout>\n );\n}\n\\`\\`\\`\n\n## Putting It All Together\n\nHere's a complete router setup with web layouts:\n\n\\`\\`\\`tsx\nimport { NavigatorParam } from '@idealyst/navigation';\nimport { StackLayout } from './layouts/StackLayout';\nimport { TabLayout } from './layouts/TabLayout';\n\nconst appRouter: NavigatorParam = {\n path: \"/\",\n type: 'navigator',\n layout: 'stack',\n layoutComponent: StackLayout, // Web header\n options: {\n headerTitle: \"My App\",\n headerRight: <UserMenu />,\n },\n routes: [\n {\n path: \"main\",\n type: 'navigator',\n layout: 'tab',\n layoutComponent: TabLayout, // Web tab bar\n routes: [\n {\n path: \"home\",\n type: 'screen',\n component: HomeScreen,\n options: {\n tabBarLabel: \"Home\",\n tabBarIcon: ({ color }) => <Icon name=\"home\" color={color} />,\n },\n },\n {\n path: \"search\",\n type: 'screen',\n component: SearchScreen,\n options: {\n tabBarLabel: \"Search\",\n tabBarIcon: ({ color }) => <Icon name=\"magnify\" color={color} />,\n },\n },\n ],\n },\n {\n path: \"settings\",\n type: 'screen',\n component: SettingsScreen,\n },\n ],\n};\n\\`\\`\\`\n\n## Key Insights\n\n1. **layoutComponent is web-only** - Native ignores it and uses native navigators\n2. **Same route config, different UI** - Your routes stay the same, layouts differ\n3. **Options are your data source** - headerTitle, tabBarIcon, etc. drive your layout\n4. **routes array is navigation menu** - Use it to build sidebars, tab bars, menus\n5. **currentPath enables active states** - Compare to highlight current item\n6. **Outlet renders children** - From react-router-dom, this is where screen content goes\n\n## Common Patterns\n\n### Responsive Layout\n\\`\\`\\`tsx\nfunction ResponsiveLayout(props: StackLayoutProps) {\n const { width } = useWindowDimensions();\n const isMobile = width < 768;\n\n // Tabs on mobile, drawer on desktop\n return isMobile\n ? <TabLayout {...props} />\n : <DrawerLayout {...props} />;\n}\n\\`\\`\\`\n\n### Nested Headers\n\\`\\`\\`tsx\n// Parent navigator has app header\n// Child navigator has section header\n{\n path: \"/\",\n layoutComponent: AppHeaderLayout,\n routes: [{\n path: \"admin\",\n layoutComponent: AdminSectionHeader, // Adds another header\n routes: [...]\n }]\n}\n\\`\\`\\`\n\n### Hiding Navigation\n\\`\\`\\`tsx\nfunction ConditionalLayout(props: StackLayoutProps) {\n // Hide navigation on certain routes\n if (props.currentPath.includes('/fullscreen')) {\n return <Outlet />; // No chrome\n }\n return <FullLayout {...props} />;\n}\n\\`\\`\\`\n\n## Summary\n\n| Native Gets | Web Needs |\n|-------------|-----------|\n| Stack header | \\`layoutComponent\\` with header UI |\n| Tab bar | \\`layoutComponent\\` with tab buttons |\n| Drawer | \\`layoutComponent\\` with sidebar |\n| Back button | \\`canGoBack()\\` + \\`goBack()\\` |\n| Active states | Compare \\`currentPath\\` to \\`route.fullPath\\` |\n| Screen options | Access via \\`options\\` and \\`route.options\\` |\n\nThe key to web/mobile parity is understanding that **layout components give web everything native navigators provide automatically**.\n`,\n};\n","export const translateGuides: Record<string, string> = {\n \"idealyst://translate/overview\": `# @idealyst/translate Overview\n\nCross-platform internationalization for the Idealyst Framework. Wraps \\`react-i18next\\` with a unified API and includes a Babel plugin for static translation key analysis.\n\n## Core Features\n\n- **Unified API** - Single API for React and React Native\n- **Babel Plugin** - Static extraction of translation keys at build time\n- **Missing Translation Detection** - Automatically detect keys missing translations\n- **Unused Translation Detection** - Find translations not used in code\n- **JSON Report** - Generate detailed reports for CI/CD integration\n- **Namespace Support** - Organize translations with nested namespaces\n- **Pluralization** - Full i18next pluralization support\n- **Interpolation** - Variable interpolation in translations\n- **Rich Text** - Component interpolation with the Trans component\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/translate react-i18next i18next\n\\`\\`\\`\n\n## Quick Start\n\n### 1. Create Translation Files\n\n\\`\\`\\`\nlocales/\n├── en/\n│ └── common.json\n└── es/\n └── common.json\n\\`\\`\\`\n\n**locales/en/common.json**\n\\`\\`\\`json\n{\n \"welcome\": {\n \"title\": \"Welcome to Our App\",\n \"greeting\": \"Hello, {{name}}!\"\n },\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\"\n }\n}\n\\`\\`\\`\n\n### 2. Set Up the Provider\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <MyApp />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n### 3. Use Translations\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction MyComponent() {\n const { t } = useTranslation('common');\n\n return (\n <div>\n <h1>{t('welcome.title')}</h1>\n <p>{t('welcome.greeting', { name: 'John' })}</p>\n <button>{t('buttons.submit')}</button>\n </div>\n );\n}\n\\`\\`\\`\n\n## Key Concepts\n\n### Key Formats\nThe package supports two key formats:\n\n\\`\\`\\`tsx\n// Namespace:key format (i18next standard)\nt('auth:login.title')\n\n// Namespace.key format (first segment is namespace)\nt('auth.login.title')\n\\`\\`\\`\n\n### Namespace Organization\nOrganize translations by domain:\n- \\`common.json\\` - Shared UI strings\n- \\`auth.json\\` - Authentication strings\n- \\`errors.json\\` - Error messages\n- \\`forms.json\\` - Form labels and validation\n`,\n\n \"idealyst://translate/runtime-api\": `# Runtime API Reference\n\nComplete reference for the @idealyst/translate runtime API.\n\n## TranslateProvider\n\nWrap your app with the provider to enable translations:\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\n\n<TranslateProvider\n config={{\n defaultLanguage: 'en',\n languages: ['en', 'es', 'fr'],\n resources: {\n en: { common: enCommon, auth: enAuth },\n es: { common: esCommon, auth: esAuth },\n },\n defaultNamespace: 'common',\n fallbackLanguage: 'en',\n debug: false,\n }}\n onInitialized={(i18n) => console.log('i18n ready')}\n onLanguageChanged={(lang) => console.log('Language:', lang)}\n>\n <App />\n</TranslateProvider>\n\\`\\`\\`\n\n### TranslateConfig Options\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| \\`defaultLanguage\\` | string | Yes | Default language code |\n| \\`languages\\` | string[] | Yes | Supported language codes |\n| \\`resources\\` | object | No | Pre-loaded translation resources |\n| \\`defaultNamespace\\` | string | No | Default namespace (default: 'translation') |\n| \\`fallbackLanguage\\` | string | No | Fallback when key missing |\n| \\`debug\\` | boolean | No | Enable debug logging |\n\n## useTranslation Hook\n\nThe main hook for accessing translations:\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction Component() {\n const { t, language, languages, ready, i18n } = useTranslation('common');\n\n // Simple translation\n const title = t('welcome.title');\n\n // With interpolation\n const greeting = t('welcome.greeting', { name: 'World' });\n\n // With default value\n const fallback = t('missing.key', { defaultValue: 'Fallback text' });\n\n // With pluralization\n const items = t('items', { count: 5 });\n\n // With context\n const gendered = t('liked', { context: 'male' });\n\n return <div>{title}</div>;\n}\n\\`\\`\\`\n\n### Return Values\n\n| Property | Type | Description |\n|----------|------|-------------|\n| \\`t\\` | function | Translation function |\n| \\`language\\` | string | Current language code |\n| \\`languages\\` | string[] | All available languages |\n| \\`ready\\` | boolean | Whether translations are loaded |\n| \\`i18n\\` | i18n | i18next instance for advanced usage |\n\n### Translation Options\n\n\\`\\`\\`tsx\nt('key', {\n // Default value if key not found\n defaultValue: 'Fallback',\n\n // Interpolation values\n name: 'John',\n count: 5,\n\n // Pluralization count\n count: 3,\n\n // Context for contextual translations\n context: 'male',\n});\n\\`\\`\\`\n\n## useLanguage Hook\n\nFor language management:\n\n\\`\\`\\`tsx\nimport { useLanguage } from '@idealyst/translate';\n\nfunction LanguageControls() {\n const {\n language, // Current: 'en'\n languages, // Available: ['en', 'es', 'fr']\n setLanguage, // Change language\n isSupported, // Check availability\n getDisplayName, // Get 'English', 'Español'\n } = useLanguage();\n\n return (\n <select value={language} onChange={(e) => setLanguage(e.target.value)}>\n {languages.map((lang) => (\n <option key={lang} value={lang}>\n {getDisplayName(lang)}\n </option>\n ))}\n </select>\n );\n}\n\\`\\`\\`\n\n## Trans Component\n\nFor rich text with embedded components:\n\n\\`\\`\\`tsx\nimport { Trans } from '@idealyst/translate';\n\nfunction RichText() {\n return (\n <Trans\n i18nKey=\"common.richText\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n bold: <strong />,\n }}\n values={{ name: 'User' }}\n />\n );\n}\n\n// Translation:\n// \"richText\": \"Read our <terms>Terms</terms> and <privacy>Privacy Policy</privacy>\"\n//\n// Renders:\n// Read our <a href=\"/terms\">Terms</a> and <a href=\"/privacy\">Privacy Policy</a>\n\\`\\`\\`\n\n### Trans Props\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| \\`i18nKey\\` | string | Yes | Translation key |\n| \\`ns\\` | string | No | Namespace |\n| \\`components\\` | object | No | Component interpolations |\n| \\`values\\` | object | No | Value interpolations |\n| \\`count\\` | number | No | Pluralization count |\n`,\n\n \"idealyst://translate/babel-plugin\": `# Babel Plugin Reference\n\nThe Babel plugin extracts translation keys at build time and generates reports of missing/unused translations.\n\n## Installation\n\nThe plugin is included with @idealyst/translate. Just configure it in your Babel config.\n\n## Configuration\n\n### babel.config.js\n\n\\`\\`\\`javascript\nmodule.exports = {\n presets: ['@babel/preset-react', '@babel/preset-typescript'],\n plugins: [\n ['@idealyst/translate/plugin', {\n // Required: paths to translation JSON files\n translationFiles: ['./locales/**/*.json'],\n\n // Optional: output path for the report\n reportPath: '.idealyst/translations-report.json',\n\n // Optional: default namespace\n defaultNamespace: 'common',\n\n // Optional: emit console warnings\n emitWarnings: true,\n\n // Optional: fail build on missing translations\n failOnMissing: false,\n\n // Optional: verbose logging\n verbose: false,\n }],\n ],\n};\n\\`\\`\\`\n\n### Vite Configuration\n\n\\`\\`\\`typescript\n// vite.config.ts\nimport { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [\n react({\n babel: {\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n }],\n ],\n },\n }),\n ],\n});\n\\`\\`\\`\n\n### React Native Configuration\n\n\\`\\`\\`javascript\n// babel.config.js\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n emitWarnings: true,\n }],\n ],\n};\n\\`\\`\\`\n\n## Plugin Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| \\`translationFiles\\` | string[] | Required | Glob patterns for translation files |\n| \\`reportPath\\` | string | '.idealyst/translations-report.json' | Output path for report |\n| \\`languages\\` | string[] | Auto-detected | Languages to check |\n| \\`defaultNamespace\\` | string | 'translation' | Default namespace |\n| \\`failOnMissing\\` | boolean | false | Fail build if missing |\n| \\`emitWarnings\\` | boolean | true | Console warnings |\n| \\`verbose\\` | boolean | false | Verbose logging |\n\n## What Gets Extracted\n\nThe plugin statically analyzes your code for:\n\n\\`\\`\\`tsx\n// t() function calls\nt('common.key')\nt('namespace:key')\nt('key', { defaultValue: 'Default' })\n\n// i18n.t() method calls\ni18n.t('common.key')\n\n// Trans component\n<Trans i18nKey=\"common.richText\" />\n<Trans i18nKey={\"common.richText\"} />\n\n// Dynamic keys (tracked but marked as dynamic)\nconst key = \\`common.\\${type}\\`;\nt(key); // Marked as isDynamic: true\n\\`\\`\\`\n\n## Report Structure\n\nThe plugin generates a JSON report:\n\n\\`\\`\\`json\n{\n \"timestamp\": \"2026-01-08T12:00:00.000Z\",\n \"totalKeys\": 45,\n \"dynamicKeys\": [\n {\n \"key\": \"<dynamic>\",\n \"file\": \"src/DynamicComponent.tsx\",\n \"line\": 15,\n \"isDynamic\": true\n }\n ],\n \"extractedKeys\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"localKey\": \"buttons.submit\",\n \"file\": \"src/Form.tsx\",\n \"line\": 42,\n \"column\": 12,\n \"defaultValue\": \"Submit\",\n \"isDynamic\": false\n }\n ],\n \"languages\": [\"en\", \"es\", \"fr\"],\n \"missing\": {\n \"en\": [],\n \"es\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"usedIn\": [\n { \"file\": \"src/Form.tsx\", \"line\": 42, \"column\": 12 }\n ],\n \"defaultValue\": \"Submit\"\n }\n ]\n },\n \"unused\": {\n \"en\": [\"common.legacy.oldFeature\"]\n },\n \"summary\": {\n \"totalMissing\": 1,\n \"totalUnused\": 1,\n \"coveragePercent\": {\n \"en\": 100,\n \"es\": 98,\n \"fr\": 100\n }\n }\n}\n\\`\\`\\`\n\n## CI/CD Integration\n\n### GitHub Actions\n\n\\`\\`\\`yaml\nname: Translation Check\n\non: [push, pull_request]\n\njobs:\n check-translations:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - uses: actions/setup-node@v3\n with:\n node-version: '20'\n - run: yarn install\n - run: yarn build\n - name: Check missing translations\n run: |\n MISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n if [ \"$MISSING\" -gt 0 ]; then\n echo \"Missing translations: $MISSING\"\n jq '.missing' .idealyst/translations-report.json\n exit 1\n fi\n\\`\\`\\`\n\n### Shell Script\n\n\\`\\`\\`bash\n#!/bin/bash\nyarn build\n\nMISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n\nif [ \"$MISSING\" -gt 0 ]; then\n echo \"ERROR: $MISSING missing translation(s)\"\n jq -r '.missing | to_entries[] | select(.value | length > 0) | \"\\\\(.key): \\\\(.value | length) missing\"' \\\\\n .idealyst/translations-report.json\n exit 1\nfi\n\necho \"All translations present!\"\n\\`\\`\\`\n`,\n\n \"idealyst://translate/translation-files\": `# Translation File Format\n\nGuide to organizing and formatting translation files for @idealyst/translate.\n\n## Directory Structure\n\nOrganize translations by language and namespace:\n\n\\`\\`\\`\nlocales/\n├── en/\n│ ├── common.json # Common UI strings\n│ ├── auth.json # Authentication strings\n│ ├── errors.json # Error messages\n│ └── forms.json # Form labels\n├── es/\n│ ├── common.json\n│ ├── auth.json\n│ ├── errors.json\n│ └── forms.json\n└── fr/\n ├── common.json\n ├── auth.json\n ├── errors.json\n └── forms.json\n\\`\\`\\`\n\n## JSON Format\n\n### Basic Structure\n\n\\`\\`\\`json\n{\n \"simple\": \"Simple text\",\n\n \"nested\": {\n \"keys\": {\n \"work\": \"Like this\"\n }\n }\n}\n\\`\\`\\`\n\n### Interpolation\n\nUse \\`{{variable}}\\` for dynamic values:\n\n\\`\\`\\`json\n{\n \"greeting\": \"Hello, {{name}}!\",\n \"welcome\": \"Welcome back, {{user}}. You have {{count}} messages.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('greeting', { name: 'John' }) // \"Hello, John!\"\nt('welcome', { user: 'Alice', count: 5 }) // \"Welcome back, Alice. You have 5 messages.\"\n\\`\\`\\`\n\n### Pluralization\n\nAdd \\`_plural\\` suffix for plural forms:\n\n\\`\\`\\`json\n{\n \"item\": \"{{count}} item\",\n \"item_plural\": \"{{count}} items\",\n\n \"message\": \"You have {{count}} new message\",\n \"message_plural\": \"You have {{count}} new messages\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('item', { count: 1 }) // \"1 item\"\nt('item', { count: 5 }) // \"5 items\"\n\\`\\`\\`\n\n### Context\n\nAdd \\`_context\\` suffix for contextual variations:\n\n\\`\\`\\`json\n{\n \"friend\": \"A friend\",\n \"friend_male\": \"A boyfriend\",\n \"friend_female\": \"A girlfriend\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('friend') // \"A friend\"\nt('friend', { context: 'male' }) // \"A boyfriend\"\nt('friend', { context: 'female' }) // \"A girlfriend\"\n\\`\\`\\`\n\n### Rich Text (Trans Component)\n\nUse HTML-like tags for component interpolation:\n\n\\`\\`\\`json\n{\n \"terms\": \"By signing up, you agree to our <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>.\",\n \"welcome\": \"Welcome, <bold>{{name}}</bold>! Click <link>here</link> to continue.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\n<Trans\n i18nKey=\"common.terms\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n }}\n/>\n\\`\\`\\`\n\n## Namespace Organization\n\n### common.json - Shared UI\n\\`\\`\\`json\n{\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\",\n \"save\": \"Save\",\n \"delete\": \"Delete\",\n \"edit\": \"Edit\"\n },\n \"labels\": {\n \"loading\": \"Loading...\",\n \"danger\": \"An error occurred\",\n \"success\": \"Success!\"\n }\n}\n\\`\\`\\`\n\n### auth.json - Authentication\n\\`\\`\\`json\n{\n \"login\": {\n \"title\": \"Sign In\",\n \"email\": \"Email\",\n \"password\": \"Password\",\n \"submit\": \"Sign In\",\n \"forgotPassword\": \"Forgot password?\"\n },\n \"register\": {\n \"title\": \"Create Account\",\n \"submit\": \"Sign Up\"\n },\n \"errors\": {\n \"invalidCredentials\": \"Invalid email or password\",\n \"emailTaken\": \"Email is already registered\"\n }\n}\n\\`\\`\\`\n\n### errors.json - Error Messages\n\\`\\`\\`json\n{\n \"network\": {\n \"offline\": \"You are offline. Please check your connection.\",\n \"timeout\": \"Request timed out. Please try again.\"\n },\n \"validation\": {\n \"required\": \"This field is required\",\n \"email\": \"Please enter a valid email\",\n \"minLength\": \"Must be at least {{min}} characters\"\n },\n \"http\": {\n \"400\": \"Bad request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not found\",\n \"500\": \"Server error\"\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n### 1. Use Descriptive Keys\n\\`\\`\\`json\n// Good\n{\n \"userProfile\": {\n \"editButton\": \"Edit Profile\",\n \"saveSuccess\": \"Profile saved successfully\"\n }\n}\n\n// Avoid\n{\n \"btn1\": \"Edit Profile\",\n \"msg1\": \"Profile saved successfully\"\n}\n\\`\\`\\`\n\n### 2. Group Related Translations\n\\`\\`\\`json\n{\n \"checkout\": {\n \"title\": \"Checkout\",\n \"steps\": {\n \"shipping\": \"Shipping\",\n \"payment\": \"Payment\",\n \"review\": \"Review\"\n },\n \"buttons\": {\n \"next\": \"Continue\",\n \"back\": \"Go Back\",\n \"placeOrder\": \"Place Order\"\n }\n }\n}\n\\`\\`\\`\n\n### 3. Keep Keys Consistent Across Languages\nAll language files should have the same key structure:\n\n\\`\\`\\`json\n// en/common.json\n{ \"greeting\": \"Hello\" }\n\n// es/common.json\n{ \"greeting\": \"Hola\" }\n\n// fr/common.json\n{ \"greeting\": \"Bonjour\" }\n\\`\\`\\`\n\n### 4. Add Comments with Default Values\nThe Babel plugin extracts \\`defaultValue\\` for documentation:\n\n\\`\\`\\`tsx\nt('newFeature.title', { defaultValue: 'New Feature' })\n\\`\\`\\`\n\nThis appears in the report and helps translators understand context.\n`,\n\n \"idealyst://translate/examples\": `# Translation Examples\n\nComplete code examples for common @idealyst/translate patterns.\n\n## Basic App Setup\n\n\\`\\`\\`tsx\n// App.tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <Navigation />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n## Component with Translations\n\n\\`\\`\\`tsx\n// components/WelcomeScreen.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\nexport function WelcomeScreen() {\n const { t } = useTranslation('common');\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h4\" weight=\"bold\">{t('welcome.title')}</Text>\n <Text typography=\"body1\">{t('welcome.subtitle')}</Text>\n <Button onPress={() => {}}>\n {t('buttons.getStarted')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Language Switcher Component\n\n\\`\\`\\`tsx\n// components/LanguageSwitcher.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useLanguage } from '@idealyst/translate';\n\nexport function LanguageSwitcher() {\n const { language, languages, setLanguage, getDisplayName } = useLanguage();\n\n return (\n <View style={{ flexDirection: 'row', gap: 8 }}>\n {languages.map((lang) => (\n <Button\n key={lang}\n type={language === lang ? 'contained' : 'outlined'}\n size=\"sm\"\n onPress={() => setLanguage(lang)}\n >\n {getDisplayName(lang)}\n </Button>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Form with Validation Messages\n\n\\`\\`\\`tsx\n// components/LoginForm.tsx\nimport { View, TextInput, Button, Text } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\nimport { useState } from 'react';\n\nexport function LoginForm() {\n const { t } = useTranslation('auth');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async () => {\n try {\n // ... login logic\n } catch (e) {\n setError(t('errors.invalidCredentials'));\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">{t('login.title')}</Text>\n\n <View gap=\"xs\">\n <Text typography=\"caption\" weight=\"medium\">{t('login.email')}</Text>\n <TextInput\n value={email}\n onChangeText={setEmail}\n placeholder={t('login.emailPlaceholder')}\n inputMode=\"email\"\n textContentType=\"emailAddress\"\n />\n </View>\n\n <View gap=\"xs\">\n <Text typography=\"caption\" weight=\"medium\">{t('login.password')}</Text>\n <TextInput\n value={password}\n onChangeText={setPassword}\n placeholder={t('login.passwordPlaceholder')}\n secureTextEntry\n textContentType=\"password\"\n />\n </View>\n\n {error && <Text color=\"red\">{error}</Text>}\n\n <Button onPress={handleSubmit}>\n {t('login.submit')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Pluralization Example\n\n\\`\\`\\`tsx\n// components/NotificationBadge.tsx\nimport { Badge } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\ninterface Props {\n count: number;\n}\n\nexport function NotificationBadge({ count }: Props) {\n const { t } = useTranslation('common');\n\n if (count === 0) return null;\n\n return (\n <Badge intent=\"primary\">\n {t('notifications.count', { count })}\n </Badge>\n );\n}\n\n// Translation file:\n// {\n// \"notifications\": {\n// \"count\": \"{{count}} notification\",\n// \"count_plural\": \"{{count}} notifications\"\n// }\n// }\n\\`\\`\\`\n\n## Rich Text with Trans Component\n\n\\`\\`\\`tsx\n// components/TermsAgreement.tsx\nimport { View, Text, Checkbox } from '@idealyst/components';\nimport { Trans, useTranslation } from '@idealyst/translate';\nimport { Link } from '@idealyst/navigation';\nimport { useState } from 'react';\n\nexport function TermsAgreement() {\n const { t } = useTranslation('auth');\n const [agreed, setAgreed] = useState(false);\n\n return (\n <View>\n <Checkbox\n checked={agreed}\n onChange={setAgreed}\n label={\n <Trans\n i18nKey=\"auth.termsAgreement\"\n components={{\n terms: <Link to=\"/terms\" />,\n privacy: <Link to=\"/privacy\" />,\n }}\n />\n }\n />\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"termsAgreement\": \"I agree to the <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>\"\n// }\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\n// hooks/usePersistedLanguage.ts\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst LANGUAGE_KEY = '@app/language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n AsyncStorage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n AsyncStorage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## Multiple Namespaces\n\n\\`\\`\\`tsx\n// components/UserProfile.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\nexport function UserProfile() {\n // Load multiple namespaces\n const { t } = useTranslation(['common', 'user']);\n\n return (\n <View padding=\"md\" gap=\"md\">\n {/* Use namespace prefix */}\n <Text typography=\"h5\" weight=\"bold\">{t('user:profile.title')}</Text>\n <Button>{t('common:buttons.edit')}</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Date and Number Formatting\n\n\\`\\`\\`tsx\n// components/OrderSummary.tsx\nimport { View, Text } from '@idealyst/components';\nimport { useTranslation, useLanguage } from '@idealyst/translate';\n\ninterface Props {\n total: number;\n orderDate: Date;\n}\n\nexport function OrderSummary({ total, orderDate }: Props) {\n const { t } = useTranslation('orders');\n const { language } = useLanguage();\n\n // Format based on current language\n const formattedTotal = new Intl.NumberFormat(language, {\n style: 'currency',\n currency: 'USD',\n }).format(total);\n\n const formattedDate = new Intl.DateTimeFormat(language, {\n dateStyle: 'long',\n }).format(orderDate);\n\n return (\n <View>\n <Text>{t('summary.total', { amount: formattedTotal })}</Text>\n <Text>{t('summary.date', { date: formattedDate })}</Text>\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"summary\": {\n// \"total\": \"Total: {{amount}}\",\n// \"date\": \"Order placed on {{date}}\"\n// }\n// }\n\\`\\`\\`\n`,\n};\n","export const storageGuides: Record<string, string> = {\n \"idealyst://storage/overview\": `# @idealyst/storage Overview\n\nCross-platform storage solution for React and React Native applications. Provides a consistent async API for persistent data storage.\n\n## Features\n\n- **Cross-Platform** - Works seamlessly on React Native and Web\n- **Simple API** - Async/await based with consistent interface\n- **React Native** - Uses MMKV for high-performance storage\n- **Web** - Uses localStorage with proper error handling\n- **TypeScript** - Full type safety and IntelliSense support\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/storage\n\n# React Native also needs:\nyarn add react-native-mmkv\ncd ios && pod install\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Store string data\nawait storage.setItem('token', 'abc123');\n\n// Store objects (use JSON.stringify)\nawait storage.setItem('user', JSON.stringify({ name: 'John', id: 123 }));\n\n// Retrieve string data\nconst token = await storage.getItem('token');\n\n// Retrieve and parse objects\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) : null;\n\n// Remove data\nawait storage.removeItem('token');\n\n// Clear all data\nawait storage.clear();\n\n// Get all keys\nconst keys = await storage.getAllKeys();\n\\`\\`\\`\n\n## Import Options\n\n\\`\\`\\`tsx\n// Named import (recommended)\nimport { storage } from '@idealyst/storage';\n\n// Default import\nimport storage from '@idealyst/storage';\n\\`\\`\\`\n\n## Platform Details\n\n- **React Native**: Uses \\`react-native-mmkv\\` for high-performance storage\n- **Web**: Uses browser \\`localStorage\\`\n`,\n\n \"idealyst://storage/api\": `# Storage API Reference\n\nComplete API reference for @idealyst/storage.\n\n## setItem\n\nStore a string value with the given key.\n\n\\`\\`\\`tsx\nawait storage.setItem(key: string, value: string): Promise<void>\n\n// Examples\nawait storage.setItem('token', 'abc123');\nawait storage.setItem('userId', '42');\n\n// For objects, use JSON.stringify\nawait storage.setItem('user', JSON.stringify({ name: 'John', age: 30 }));\nawait storage.setItem('tags', JSON.stringify(['react', 'native']));\nawait storage.setItem('settings', JSON.stringify({ theme: 'dark', notifications: true }));\n\\`\\`\\`\n\n## getItem\n\nRetrieve a string value by key. Returns \\`null\\` if the key doesn't exist.\n\n\\`\\`\\`tsx\nawait storage.getItem(key: string): Promise<string | null>\n\n// Examples\nconst token = await storage.getItem('token');\nconst userId = await storage.getItem('userId');\n\n// For objects, parse the JSON\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) as User : null;\n\nconst tagsData = await storage.getItem('tags');\nconst tags = tagsData ? JSON.parse(tagsData) as string[] : [];\n\nif (user) {\n console.log(user.name);\n}\n\\`\\`\\`\n\n## removeItem\n\nRemove a specific item from storage.\n\n\\`\\`\\`tsx\nawait storage.removeItem(key: string): Promise<void>\n\n// Examples\nawait storage.removeItem('user');\nawait storage.removeItem('temporaryData');\n\\`\\`\\`\n\n## clear\n\nRemove all items from storage.\n\n\\`\\`\\`tsx\nawait storage.clear(): Promise<void>\n\\`\\`\\`\n\n## getAllKeys\n\nReturns all keys currently in storage.\n\n\\`\\`\\`tsx\nawait storage.getAllKeys(): Promise<string[]>\n\n// Example\nconst keys = await storage.getAllKeys();\nconsole.log('Stored keys:', keys); // ['user', 'settings', 'token']\n\\`\\`\\`\n\n## Helper Pattern for Typed Storage\n\nCreate a typed wrapper for cleaner code:\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Helper functions for typed storage\nasync function setObject<T>(key: string, value: T): Promise<void> {\n await storage.setItem(key, JSON.stringify(value));\n}\n\nasync function getObject<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(key);\n return data ? JSON.parse(data) as T : null;\n}\n\n// Usage\ninterface User {\n id: number;\n name: string;\n}\n\nawait setObject<User>('user', { id: 1, name: 'John' });\nconst user = await getObject<User>('user');\n\\`\\`\\`\n`,\n\n \"idealyst://storage/examples\": `# Storage Examples\n\nComplete code examples for common @idealyst/storage patterns.\n\n## User Session Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\nclass AuthService {\n static async saveUserSession(user: User, token: string) {\n await Promise.all([\n storage.setItem('currentUser', JSON.stringify(user)),\n storage.setItem('authToken', token),\n storage.setItem('loginTime', new Date().toISOString()),\n ]);\n }\n\n static async getUserSession() {\n const userData = await storage.getItem('currentUser');\n const token = await storage.getItem('authToken');\n\n const user = userData ? JSON.parse(userData) as User : null;\n return user && token ? { user, token } : null;\n }\n\n static async clearSession() {\n await Promise.all([\n storage.removeItem('currentUser'),\n storage.removeItem('authToken'),\n storage.removeItem('loginTime'),\n ]);\n }\n}\n\\`\\`\\`\n\n## Settings Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface AppSettings {\n theme: 'light' | 'dark';\n notifications: boolean;\n language: string;\n fontSize: number;\n}\n\nconst defaultSettings: AppSettings = {\n theme: 'light',\n notifications: true,\n language: 'en',\n fontSize: 16,\n};\n\nclass SettingsService {\n static async getSettings(): Promise<AppSettings> {\n const data = await storage.getItem('appSettings');\n const stored = data ? JSON.parse(data) as AppSettings : null;\n return stored ? { ...defaultSettings, ...stored } : defaultSettings;\n }\n\n static async updateSettings(newSettings: Partial<AppSettings>) {\n const current = await this.getSettings();\n const updated = { ...current, ...newSettings };\n await storage.setItem('appSettings', JSON.stringify(updated));\n return updated;\n }\n\n static async resetSettings() {\n await storage.setItem('appSettings', JSON.stringify(defaultSettings));\n return defaultSettings;\n }\n}\n\\`\\`\\`\n\n## Cache with Expiration\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface CacheItem<T> {\n data: T;\n timestamp: number;\n expiresIn: number; // milliseconds\n}\n\nclass CacheService {\n static async setCache<T>(key: string, data: T, expiresIn: number = 3600000) {\n const cacheItem: CacheItem<T> = {\n data,\n timestamp: Date.now(),\n expiresIn,\n };\n\n await storage.setItem(\\`cache_\\${key}\\`, JSON.stringify(cacheItem));\n }\n\n static async getCache<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(\\`cache_\\${key}\\`);\n if (!data) return null;\n\n const cacheItem = JSON.parse(data) as CacheItem<T>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n\n if (isExpired) {\n await storage.removeItem(\\`cache_\\${key}\\`);\n return null;\n }\n\n return cacheItem.data;\n }\n\n static async clearExpiredCache() {\n const keys = await storage.getAllKeys();\n const cacheKeys = keys.filter(key => key.startsWith('cache_'));\n\n for (const key of cacheKeys) {\n const data = await storage.getItem(key);\n if (data) {\n const cacheItem = JSON.parse(data) as CacheItem<unknown>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n if (isExpired) {\n await storage.removeItem(key);\n }\n }\n }\n }\n}\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\n\nconst LANGUAGE_KEY = 'app_language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n storage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n storage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## React Hook for Storage\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function useStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(initialValue);\n const [loading, setLoading] = useState(true);\n\n // Load value on mount\n useEffect(() => {\n storage.getItem(key).then((stored) => {\n if (stored !== null) {\n setValue(JSON.parse(stored) as T);\n }\n setLoading(false);\n });\n }, [key]);\n\n // Update storage when value changes\n const updateValue = useCallback(async (newValue: T) => {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n // Remove from storage\n const removeValue = useCallback(async () => {\n setValue(initialValue);\n await storage.removeItem(key);\n }, [key, initialValue]);\n\n return { value, setValue: updateValue, removeValue, loading };\n}\n\n// Usage\nfunction MyComponent() {\n const { value: theme, setValue: setTheme, loading } = useStorage('theme', 'light');\n\n if (loading) return <ActivityIndicator />;\n\n return (\n <Button onPress={() => setTheme(theme === 'light' ? 'dark' : 'light')}>\n Toggle Theme\n </Button>\n );\n}\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\nasync function safeStorageOperation() {\n try {\n await storage.setItem('data', JSON.stringify(largeObject));\n } catch (error) {\n console.error('Storage failed:', error);\n // Handle storage quota exceeded or other errors\n }\n\n // Or with null checking\n const result = await storage.getItem('data');\n if (result === null) {\n // Key doesn't exist or retrieval failed\n console.log('No data found');\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use JSON.stringify/parse** - Storage only accepts strings, so serialize objects\n2. **Handle Nulls** - Always check for null returns from \\`getItem\\`\n3. **Batch Operations** - Use \\`Promise.all\\` for multiple storage operations\n4. **Error Handling** - Wrap storage operations in try-catch blocks for critical data\n5. **Key Naming** - Use consistent, descriptive key names\n6. **Data Size** - Keep stored objects reasonably sized\n7. **Cleanup** - Periodically clean up unused data\n8. **Type Safety** - Create typed wrapper functions for better TypeScript support\n`,\n};\n","export const iconGuide = `# Material Design Icons Reference\n\nIdealyst uses Material Design Icons (@mdi/react) with **7,447 icons** available.\n\n## Icon Usage\n\n### TypeScript Type — CRITICAL\n\nIcon names are typed as \\`IconName\\`, NOT \\`string\\`. Use **bare names** like \\`'home'\\`, \\`'check-circle'\\` — do NOT add an \\`'mdi:'\\` prefix.\n\nWhen you create helper functions that return icon names, you MUST type them as \\`IconName\\`:\n\n\\`\\`\\`tsx\nimport type { IconName } from '@idealyst/components';\n\n// CORRECT: return type is IconName\nfunction getStatusIcon(status: string): IconName {\n switch (status) {\n case 'active': return 'check-circle';\n case 'pending': return 'clock-outline';\n default: return 'help-circle';\n }\n}\n\n// WRONG: return type 'string' will cause TS2322 error when passed to icon props\n// function getStatusIcon(status: string): string { ... } // ❌\n\n// For icon lookup maps, type the values as IconName:\nconst FILE_TYPE_ICONS: Record<string, IconName> = {\n 'image': 'file-image',\n 'video': 'file-video',\n 'audio': 'file-music',\n 'document': 'file-document',\n 'default': 'file',\n};\n\nfunction getFileIcon(type: string): IconName {\n return FILE_TYPE_ICONS[type] ?? FILE_TYPE_ICONS['default'];\n}\n\\`\\`\\`\n\n### When to Import \\`Icon\\` vs Use \\`IconName\\` Type\n\n- Import the \\`Icon\\` component only when rendering a standalone icon as JSX: \\`<Icon name=\"home\" />\\`\n- For component props like \\`leftIcon\\` on Button, \\`leading\\`/\\`trailing\\` on ListItem — pass bare string names. Do NOT import the \\`Icon\\` component for this use.\n- Import ONLY the \\`IconName\\` type (not the component) when you need a typed variable for an icon name:\n\n\\`\\`\\`tsx\nimport type { IconName } from '@idealyst/components';\nconst myIcon: IconName = 'home'; // Correct: type-only import\n\\`\\`\\`\n\n### In Components\n\n\\`\\`\\`tsx\nimport { Button, Icon, List, Badge } from '@idealyst/components';\n\n// Button with icon (use leftIcon, NOT icon)\n<Button leftIcon=\"check\">Save</Button>\n\n// Standalone Icon\n<Icon name=\"home\" size=\"md\" color=\"primary\" />\n\n// List with icons\n<ListItem label=\"Settings\" leading=\"cog\" trailing=\"chevron-right\" />\n\n// Badge with icon\n<Badge icon=\"star\">Featured</Badge>\n\\`\\`\\`\n\n### Icon Properties\n\n\\`\\`\\`tsx\n<Icon\n name=\"home\" // Icon name (required) — type: IconName\n size=\"xs|sm|md|lg|xl|number\" // Icon size\n color=\"primary|secondary|...\" // Theme color\n/>\n\\`\\`\\`\n\n## Common Icons by Category\n\n### Navigation & Actions\n- **home** - Home/dashboard\n- **menu** - Hamburger menu\n- **arrow-left** - Back/previous\n- **arrow-right** - Forward/next\n- **chevron-left** - Small back arrow\n- **chevron-right** - Small forward arrow\n- **chevron-up** - Collapse/up\n- **chevron-down** - Expand/down\n- **close** - Close/dismiss\n- **check** - Confirm/success\n- **plus** - Add/create\n- **minus** - Remove/subtract\n- **delete** - Delete/trash\n- **dots-vertical** - More options (vertical)\n- **dots-horizontal** - More options (horizontal)\n\n### User & Account\n- **account** - User profile\n- **account-circle** - User avatar\n- **account-multiple** - Multiple users/team\n- **account-plus** - Add user\n- **account-minus** - Remove user\n- **account-edit** - Edit profile\n- **account-cog** - User settings\n- **login** - Login/sign in\n- **logout** - Logout/sign out\n- **account-key** - Authentication\n\n### Communication\n- **email** - Email/mail\n- **email-outline** - Email outline variant\n- **message** - Message/chat\n- **message-text** - Text message\n- **message-reply** - Reply to message\n- **phone** - Phone/call\n- **bell** - Notifications\n- **bell-outline** - Notifications outline\n- **comment** - Comment/feedback\n- **forum** - Discussion/forum\n\n### File & Document\n- **file** - Generic file\n- **file-document** - Document\n- **file-pdf** - PDF file\n- **file-image** - Image file\n- **folder** - Folder\n- **folder-open** - Open folder\n- **download** - Download\n- **upload** - Upload\n- **attachment** - Attach file\n- **cloud-upload** - Cloud upload\n- **cloud-download** - Cloud download\n\n### Media\n- **play** - Play media\n- **pause** - Pause media\n- **stop** - Stop media\n- **skip-next** - Next track\n- **skip-previous** - Previous track\n- **volume-high** - High volume\n- **volume-low** - Low volume\n- **volume-off** - Muted\n- **image** - Picture/photo\n- **camera** - Camera\n- **video** - Video\n\n### Edit & Create\n- **pencil** - Edit\n- **pencil-outline** - Edit outline\n- **content-save** - Save\n- **content-copy** - Copy\n- **content-cut** - Cut\n- **content-paste** - Paste\n- **undo** - Undo\n- **redo** - Redo\n- **format-bold** - Bold text\n- **format-italic** - Italic text\n- **format-underline** - Underline text\n\n### Status & Alerts\n- **check-circle** - Success\n- **check-circle-outline** - Success outline\n- **alert** - Warning\n- **alert-circle** - Alert circle\n- **alert-octagon** - Critical alert\n- **information** - Information\n- **information-outline** - Info outline\n- **help-circle** - Help/question\n- **close-circle** - Error\n- **clock** - Time/pending\n\n### UI Elements\n- **magnify** - Search\n- **filter** - Filter\n- **sort** - Sort\n- **tune** - Settings/adjust\n- **cog** - Settings\n- **palette** - Theme/colors\n- **eye** - View/visible\n- **eye-off** - Hidden\n- **heart** - Favorite/like\n- **heart-outline** - Like outline\n- **star** - Star/rating\n- **star-outline** - Star outline\n- **bookmark** - Bookmark\n- **bookmark-outline** - Bookmark outline\n\n### Shopping & Commerce\n- **cart** - Shopping cart\n- **cart-outline** - Cart outline\n- **cash** - Money/payment\n- **credit-card** - Credit card\n- **tag** - Tag/label\n- **sale** - Sale/discount\n- **receipt** - Receipt\n- **store** - Store/shop\n\n### Social\n- **share** - Share\n- **share-variant** - Share variant\n- **thumb-up** - Like/upvote\n- **thumb-down** - Dislike/downvote\n- **emoticon** - Emoji/mood\n- **emoticon-happy** - Happy\n- **emoticon-sad** - Sad\n\n### Location & Map\n- **map** - Map\n- **map-marker** - Location pin\n- **navigation** - Navigation\n- **compass** - Compass\n- **earth** - Globe/world\n\n### Calendar & Time\n- **calendar** - Calendar\n- **calendar-today** - Today\n- **calendar-month** - Month view\n- **clock-outline** - Clock\n- **timer** - Timer\n\n### Device & Hardware\n- **laptop** - Laptop\n- **cellphone** - Mobile phone\n- **tablet** - Tablet\n- **desktop-mac** - Desktop\n- **monitor** - Monitor\n- **printer** - Printer\n- **wifi** - WiFi\n- **bluetooth** - Bluetooth\n\n### Weather\n- **weather-sunny** - Sunny\n- **weather-cloudy** - Cloudy\n- **weather-rainy** - Rainy\n- **weather-snowy** - Snowy\n- **weather-night** - Night\n- **white-balance-sunny** - Light mode\n- **weather-night** - Dark mode\n\n## Finding Icons\n\n### Total Available Icons\n**7,447 icons** from Material Design Icons\n\n### Browse All Icons\nVisit: https://pictogrammers.com/library/mdi/\n\n### Search Patterns\nIcons follow naming patterns:\n- Base name: \\`home\\`, \\`account\\`, \\`file\\`\n- Variants: \\`-outline\\`, \\`-filled\\`, \\`-off\\`, \\`-plus\\`, \\`-minus\\`\n- Combinations: \\`account-plus\\`, \\`file-document-outline\\`\n\n### Common Suffixes\n- **-outline**: Outline version\n- **-off**: Disabled/off state\n- **-plus**: Add/create\n- **-minus**: Remove/subtract\n- **-edit**: Edit action\n- **-check**: Verified/checked\n- **-alert**: Warning state\n\n## Icon Naming Tips\n\n1. **Be Specific**: Use descriptive names\n - ✅ \\`account-circle\\` for user avatar\n - ❌ \\`user\\` (not available)\n\n2. **Check Variants**: Try outline versions\n - \\`email\\` and \\`email-outline\\`\n - \\`heart\\` and \\`heart-outline\\`\n\n3. **Common Prefixes**:\n - \\`account-*\\`: User-related\n - \\`file-*\\`: File-related\n - \\`folder-*\\`: Folder-related\n - \\`arrow-*\\`: Arrows\n - \\`chevron-*\\`: Small arrows\n - \\`content-*\\`: Content actions\n\n4. **Use Hyphens**: Icon names use kebab-case\n - ✅ \\`arrow-left\\`\n - ❌ \\`arrowLeft\\` or \\`arrow_left\\`\n\n## Best Practices\n\n1. **Semantic Meaning**: Choose icons that match their function\n2. **Consistency**: Use the same icon for the same action throughout the app\n3. **Size Appropriately**: Match icon size to context\n4. **Color Purposefully**: Use theme colors for semantic meaning\n5. **Accessibility**: Always provide labels/tooltips for icon-only buttons\n\n## Examples\n\n### Button Icons\n\\`\\`\\`tsx\n<Button leftIcon=\"content-save\">Save</Button>\n<Button leftIcon=\"delete\" intent=\"danger\">Delete</Button>\n<Button leftIcon=\"pencil\">Edit</Button>\n<Button leftIcon=\"plus\">Add New</Button>\n\\`\\`\\`\n> **Note:** Button uses \\`leftIcon\\` and \\`rightIcon\\` — NOT \\`icon\\`.\n\n### List Icons\n\\`\\`\\`tsx\n<ListItem label=\"Dashboard\" leading=\"view-dashboard\" />\n<ListItem label=\"Users\" leading=\"account-multiple\" />\n<ListItem label=\"Settings\" leading=\"cog\" />\n<ListItem label=\"Logout\" leading=\"logout\" intent=\"danger\" />\n\\`\\`\\`\n\n### Navigation Icons\n\\`\\`\\`tsx\n<Button leftIcon=\"arrow-left\" type=\"text\">Back</Button>\n<Button leftIcon=\"menu\" type=\"text\">Menu</Button>\n<Button leftIcon=\"close\" type=\"text\">Close</Button>\n\\`\\`\\`\n\n### Status Icons\n\\`\\`\\`tsx\n<Icon name=\"check-circle\" color=\"success\" />\n<Icon name=\"alert-circle\" color=\"warning\" />\n<Icon name=\"close-circle\" color=\"danger\" />\n<Icon name=\"information-outline\" color=\"primary\" />\n\\`\\`\\`\n`;\n","/**\n * Idealyst Framework Package Registry\n * Central metadata for all @idealyst packages\n */\n\nexport interface PackageInfo {\n name: string;\n npmName: string;\n description: string;\n category: \"core\" | \"ui\" | \"media\" | \"data\" | \"auth\" | \"utility\" | \"tooling\";\n platforms: (\"web\" | \"native\" | \"node\")[];\n documentationStatus: \"full\" | \"partial\" | \"minimal\";\n installation: string;\n peerDependencies?: string[];\n features: string[];\n quickStart: string;\n apiHighlights?: string[];\n relatedPackages?: string[];\n}\n\nexport const packages: Record<string, PackageInfo> = {\n components: {\n name: \"Components\",\n npmName: \"@idealyst/components\",\n description:\n \"Cross-platform React UI components for web and React Native. Includes buttons, cards, inputs, dialogs, and 30+ more components with consistent styling.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/components @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\", \"react-native-unistyles\"],\n features: [\n \"36+ production-ready components\",\n \"Consistent API across web and native\",\n \"Theme-aware with automatic dark mode\",\n \"Accessible by default\",\n \"TypeScript-first with full type definitions\",\n \"Tree-shakeable exports\",\n ],\n quickStart: `import { Button, Card, Text } from '@idealyst/components';\n\n<Card>\n <Text typography=\"h5\" weight=\"bold\">Hello World</Text>\n <Button onPress={() => console.log('Pressed!')}>\n Click Me\n </Button>\n</Card>`,\n apiHighlights: [\n \"Button, IconButton, FAB\",\n \"Card, View, Screen\",\n \"TextInput, TextArea, Checkbox, Switch\",\n \"Dialog, Popover, Menu\",\n \"Text, Link, Badge, Chip\",\n ],\n relatedPackages: [\"theme\", \"navigation\"],\n },\n\n theme: {\n name: \"Theme\",\n npmName: \"@idealyst/theme\",\n description:\n \"Cross-platform theming system built on react-native-unistyles. Provides colors, typography, spacing, responsive breakpoints, shadow utilities, and style helpers with a fluent builder API.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/theme react-native-unistyles\",\n peerDependencies: [\"react-native-unistyles\"],\n features: [\n \"Light and dark theme variants\",\n \"Semantic color tokens (intent-based)\",\n \"Fluent builder API for theme creation\",\n \"Individual color modification (add/set surface, text, border, pallet)\",\n \"Intent management (addIntent, setIntent)\",\n \"Responsive breakpoints\",\n \"Typography scale\",\n \"Spacing and sizing utilities\",\n \"Platform-specific adaptations\",\n \"shadow() - Cross-platform shadow styles\",\n \"useStyleProps() - Unified Unistyles + inline style handling\",\n ],\n quickStart: `import { UnistylesProvider, shadow, useStyleProps } from '@idealyst/theme';\nimport { View } from '@idealyst/components';\n\n// Cross-platform shadows\n<View style={shadow({ radius: 10, y: 4, opacity: 0.15 })}>\n Shadowed content\n</View>\n\n// Unified style handling for custom components\nfunction MyComponent({ style }) {\n const styleProps = useStyleProps(\n (styles.container as any)({}), // Unistyles\n [style, { marginTop: 16 }] // Additional styles\n );\n return <View {...styleProps}>Content</View>;\n}`,\n apiHighlights: [\n \"createTheme() / fromTheme(base) - Theme builder\",\n \"addIntent() / setIntent() - Intent management\",\n \"addSurfaceColor() / setSurfaceColor() - Surface colors\",\n \"addTextColor() / setTextColor() - Text colors\",\n \"addBorderColor() / setBorderColor() - Border colors\",\n \"addPalletColor() / setPalletColor() - Pallet colors\",\n \"shadow({ radius, x, y, color, opacity }) - Cross-platform shadows\",\n \"useStyleProps(unistyles, inlineStyles) - Style prop unification\",\n \"Size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n \"Intent: 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\",\n ],\n relatedPackages: [\"components\"],\n },\n\n navigation: {\n name: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description:\n \"Unified navigation system for web and React Native. Stack, tab, drawer, and modal navigators with type-safe routing.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/navigation\",\n peerDependencies: [\"@react-navigation/native (native only)\"],\n features: [\n \"Type-safe route definitions\",\n \"Stack, Tab, Drawer, Modal navigators\",\n \"Deep linking support\",\n \"Custom layouts for web (headers, sidebars)\",\n \"useNavigator hook for navigation actions\",\n \"Cross-platform URL handling\",\n ],\n quickStart: `import { Router, useNavigator } from '@idealyst/navigation';\n\nconst routes = {\n home: { path: '/', screen: HomeScreen },\n profile: { path: '/profile/:id', screen: ProfileScreen },\n};\n\n<Router routes={routes} />`,\n apiHighlights: [\n \"Router component\",\n \"useNavigator() hook\",\n \"Route configuration\",\n \"Navigator types (stack, tabs, drawer)\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n cli: {\n name: \"CLI\",\n npmName: \"@idealyst/cli\",\n description:\n \"Command-line tool for generating Idealyst projects. Creates monorepo workspaces with web, native, API, and database packages.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"npx @idealyst/cli init my-project\",\n features: [\n \"Monorepo workspace generation\",\n \"React Native app scaffolding\",\n \"Vite-based web app generation\",\n \"tRPC API server template\",\n \"Prisma database layer\",\n \"Shared library template\",\n ],\n quickStart: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Add a native app\ncd my-app\nnpx @idealyst/cli create mobile --type native --app-name \"My App\"\n\n# Add a web app\nnpx @idealyst/cli create web --type web --with-trpc`,\n apiHighlights: [\n \"idealyst init <name>\",\n \"idealyst create <name> --type native|web|api|database|shared\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n storage: {\n name: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with async API. Uses localStorage on web and AsyncStorage on React Native.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/storage\",\n peerDependencies: [\"@react-native-async-storage/async-storage (native)\"],\n features: [\n \"Unified API across platforms\",\n \"Async/await interface\",\n \"JSON serialization built-in\",\n \"TypeScript generics for type safety\",\n \"Prefix namespacing\",\n ],\n quickStart: `import { storage } from '@idealyst/storage';\n\n// Store a value\nawait storage.set('user', { name: 'Alice', id: 1 });\n\n// Retrieve a value\nconst user = await storage.get<User>('user');\n\n// Remove a value\nawait storage.remove('user');`,\n apiHighlights: [\n \"storage.get<T>(key)\",\n \"storage.set(key, value)\",\n \"storage.remove(key)\",\n \"storage.clear()\",\n ],\n relatedPackages: [\"oauth-client\", \"config\"],\n },\n\n translate: {\n name: \"Translate\",\n npmName: \"@idealyst/translate\",\n description:\n \"Internationalization (i18n) package with runtime API and Babel plugin for static key extraction.\",\n category: \"utility\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/translate\",\n features: [\n \"TranslateProvider for app-wide i18n\",\n \"useTranslation hook\",\n \"Interpolation support\",\n \"Pluralization\",\n \"Babel plugin for key extraction\",\n \"Missing translation detection\",\n ],\n quickStart: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\nfunction App() {\n return (\n <TranslateProvider translations={translations} defaultLanguage=\"en\">\n <MyComponent />\n </TranslateProvider>\n );\n}\n\nfunction MyComponent() {\n const { t } = useTranslation();\n return <Text>{t('greeting', { name: 'World' })}</Text>;\n}`,\n apiHighlights: [\n \"TranslateProvider\",\n \"useTranslation()\",\n \"useLanguage()\",\n \"Trans component\",\n ],\n relatedPackages: [\"components\"],\n },\n\n camera: {\n name: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture. Uses react-native-vision-camera on native and MediaDevices API on web.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/camera react-native-vision-camera\",\n peerDependencies: [\"react-native-vision-camera (native)\"],\n features: [\n \"Photo capture\",\n \"Video recording\",\n \"Camera switching (front/back)\",\n \"Flash control\",\n \"Zoom support\",\n \"Permission handling\",\n ],\n quickStart: `import { useCamera, CameraPreview, requestPermission } from '@idealyst/camera';\n\nfunction CameraScreen() {\n const camera = useCamera({ autoRequestPermission: true });\n\n const handleTakePhoto = async () => {\n const photo = await camera.takePhoto();\n console.log('Photo taken:', photo.uri);\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <Button onPress={handleTakePhoto} intent=\"primary\">Take Photo</Button>\n </View>\n );\n}`,\n apiHighlights: [\n \"CameraPreview component (NOT Camera)\",\n \"useCamera() hook — returns status, takePhoto, startRecording, stopRecording, cameraRef\",\n \"requestPermission() — standalone function (NOT useCameraPermission or requestCameraPermission)\",\n \"CameraStatus is an INTERFACE { state: CameraState, permission, isActive, error } — NOT a string enum\",\n \"CameraState = 'idle' | 'initializing' | 'ready' | 'recording' | 'capturing'\",\n \"PhotoResult { uri, width, height, metadata }\",\n \"VideoResult { uri, duration }\",\n ],\n relatedPackages: [\"components\", \"storage\"],\n },\n\n audio: {\n name: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for React and React Native. Provides recording with real-time PCM streaming, file playback, and session management for simultaneous recording and playback.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/audio react-native-audio-api\",\n peerDependencies: [\"react-native-audio-api (native)\"],\n features: [\n \"Recording with real-time PCM streaming\",\n \"File playback (mp3, wav, etc.)\",\n \"PCM streaming playback for TTS\",\n \"Audio session management (iOS/Android)\",\n \"Simultaneous recording and playback\",\n \"Audio level monitoring\",\n \"Configurable sample rates and bit depths\",\n \"Audio profiles (speech, music, phone)\",\n ],\n quickStart: `import { useRecorder, usePlayer, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction AudioApp() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const player = usePlayer();\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n // Subscribe to PCM data chunks during recording\n useEffect(() => {\n // subscribeToData receives PCMData objects (NOT strings)\n // PCMData has: buffer (ArrayBufferLike), samples (Int16Array), timestamp, config, toBase64()\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleRecord = async () => {\n if (recorder.isRecording) {\n await recorder.stop(); // stop() returns void — data comes via subscribeToData\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n // Play back recorded PCM data\n const handlePlayback = async () => {\n await player.loadPCMStream(AUDIO_PROFILES.speech);\n await player.play();\n // feedPCMData accepts ArrayBufferLike | Int16Array (NOT strings)\n for (const chunk of chunksRef.current) {\n player.feedPCMData(chunk);\n }\n await player.flush();\n };\n\n // Play an audio file (mp3, wav, etc.)\n const handlePlayFile = async () => {\n await player.loadFile('/audio/music.mp3');\n await player.play();\n };\n\n return (\n <View>\n <Button onPress={handleRecord}>\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Text typography=\"body2\">Duration: {recorder.duration}ms</Text>\n <Button onPress={handlePlayback} disabled={chunksRef.current.length === 0}>\n Play Recording\n </Button>\n </View>\n );\n}`,\n apiHighlights: [\n \"useRecorder() — PCM streaming recorder. stop() returns void. Use subscribeToData(cb) to receive PCMData chunks\",\n \"usePlayer() — File playback (loadFile) and PCM streaming (loadPCMStream + feedPCMData)\",\n \"PCMData type — { buffer: ArrayBufferLike, samples: Int16Array, timestamp, config, toBase64() }\",\n \"feedPCMData() accepts ArrayBufferLike | Int16Array — NOT strings\",\n \"useAudio() — Session management (iOS/Android)\",\n \"AUDIO_PROFILES — Pre-configured configs: speech, highQuality, studio, phone\",\n ],\n relatedPackages: [\"camera\", \"components\"],\n },\n\n datagrid: {\n name: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets. Supports sorting, filtering, and custom cell rendering.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/components\",\n \"@idealyst/theme\",\n \"react-window (web)\",\n ],\n features: [\n \"Virtualized rendering for large datasets\",\n \"Column sorting\",\n \"Row selection\",\n \"Custom cell renderers\",\n \"Fixed headers\",\n \"Responsive column sizing\",\n ],\n quickStart: `import { DataGrid } from '@idealyst/datagrid';\n\nconst columns = [\n { key: 'name', header: 'Name', width: 200 },\n { key: 'email', header: 'Email', width: 250 },\n { key: 'status', header: 'Status', width: 100 },\n];\n\n<DataGrid\n data={users}\n columns={columns}\n onRowClick={(row) => console.log('Selected:', row)}\n/>`,\n apiHighlights: [\n \"DataGrid component\",\n \"Column configuration\",\n \"Row selection callbacks\",\n \"Custom cell renderers\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n datepicker: {\n name: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description:\n \"Cross-platform date and time picker components. Includes calendar, time picker, and date range selection.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datepicker @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\"],\n features: [\n \"Date picker with calendar\",\n \"Time picker\",\n \"Date range selection\",\n \"Min/max date constraints\",\n \"Locale support\",\n \"Customizable styling\",\n ],\n quickStart: `import { DatePicker, TimePicker } from '@idealyst/datepicker';\n\n<DatePicker\n value={selectedDate}\n onChange={setSelectedDate}\n minDate={new Date()}\n/>\n\n<TimePicker\n value={selectedTime}\n onChange={setSelectedTime}\n is24Hour={true}\n/>`,\n apiHighlights: [\n \"DatePicker component\",\n \"TimePicker component\",\n \"DateRangePicker component\",\n \"Calendar component\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n \"oauth-client\": {\n name: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description:\n \"Universal OAuth2 client for web and React Native. Supports authorization code flow with PKCE.\",\n category: \"auth\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n peerDependencies: [\"@idealyst/storage\"],\n features: [\n \"Authorization code flow with PKCE\",\n \"Token refresh handling\",\n \"Secure token storage\",\n \"Multiple provider support\",\n \"Silent token refresh\",\n \"Logout handling\",\n ],\n quickStart: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'myapp://callback',\n});\n\n// Start login flow\nawait oauth.login();\n\n// Get access token\nconst token = await oauth.getAccessToken();\n\n// Logout\nawait oauth.logout();`,\n apiHighlights: [\n \"OAuthClient class\",\n \"login() / logout()\",\n \"getAccessToken()\",\n \"Token refresh handling\",\n ],\n relatedPackages: [\"storage\", \"navigation\"],\n },\n\n config: {\n name: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support. Type-safe access to env vars on web and native.\",\n category: \"utility\",\n platforms: [\"web\", \"native\", \"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/config\",\n peerDependencies: [\"react-native-config (native)\"],\n features: [\n \"Type-safe environment variables\",\n \"Cross-platform API\",\n \"Build-time configuration\",\n \"Vite plugin for web\",\n \"React Native Config integration\",\n \"Default value support\",\n ],\n quickStart: `// config.ts\nimport { defineConfig } from '@idealyst/config';\n\nexport const config = defineConfig({\n API_URL: { required: true },\n DEBUG: { default: 'false' },\n APP_NAME: { default: 'My App' },\n});\n\n// Usage\nimport { config } from './config';\nconsole.log(config.API_URL);`,\n apiHighlights: [\n \"defineConfig()\",\n \"Type-safe config object\",\n \"Vite plugin\",\n \"CLI for generation\",\n ],\n relatedPackages: [\"storage\"],\n },\n\n tooling: {\n name: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description:\n \"Code analysis and validation utilities for Idealyst Framework. Includes Vite plugins and static analyzers.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add -D @idealyst/tooling\",\n features: [\n \"Component usage analysis\",\n \"Import validation\",\n \"Vite plugin for build-time checks\",\n \"Custom rule definitions\",\n \"Documentation generation\",\n ],\n quickStart: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [\n idealystPlugin({\n validateImports: true,\n analyzeUsage: true,\n }),\n ],\n};`,\n apiHighlights: [\n \"idealystPlugin() for Vite\",\n \"analyzeComponent()\",\n \"Custom rule API\",\n ],\n relatedPackages: [\"cli\"],\n },\n\n \"mcp-server\": {\n name: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server providing AI assistants with Idealyst framework documentation, types, and examples.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/mcp-server\",\n features: [\n \"Component documentation\",\n \"Type extraction from source\",\n \"Validated code examples\",\n \"Icon search (7,447 MDI icons)\",\n \"Navigation and theme guides\",\n \"CLI command reference\",\n ],\n quickStart: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n apiHighlights: [\n \"list_components\",\n \"get_component_docs\",\n \"search_icons\",\n \"get_*_types\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n markdown: {\n name: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer for React and React Native. Supports GitHub Flavored Markdown with theme integration.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/markdown @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"react-markdown (web)\",\n \"remark-gfm (web)\",\n \"react-native-markdown-display (native)\",\n ],\n features: [\n \"GitHub Flavored Markdown support\",\n \"Tables, strikethrough, task lists\",\n \"Theme-integrated styling\",\n \"Custom link and image handlers\",\n \"Style overrides per element\",\n \"Cross-platform consistency\",\n ],\n quickStart: `import { Markdown } from '@idealyst/markdown';\n\n<Markdown\n size=\"md\"\n linkIntent=\"primary\"\n linkHandler={{\n onLinkPress: (url) => console.log('Link:', url),\n }}\n>\n{\\`# Hello World\n\nThis is **bold** and _italic_ text.\n\n| Column 1 | Column 2 |\n|----------|----------|\n| Data 1 | Data 2 |\n\\`}\n</Markdown>`,\n apiHighlights: [\n \"Markdown component\",\n \"size prop (xs-xl)\",\n \"linkIntent prop\",\n \"styleOverrides prop\",\n \"linkHandler / imageHandler\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n animate: {\n name: \"Animate\",\n npmName: \"@idealyst/animate\",\n description:\n \"Cross-platform animation hooks for React and React Native. Provides a unified API with CSS transitions on web and Reanimated on native for smooth, performant animations.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/animate react-native-reanimated\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"react-native-reanimated (native)\",\n ],\n features: [\n \"useAnimatedStyle - State-driven animations with transform object syntax\",\n \"usePresence - Mount/unmount animations with enter/exit states\",\n \"useAnimatedValue - Imperative animated values with interpolation\",\n \"useGradientBorder - Animated gradient border effects\",\n \"withAnimated HOC - Wrap components for Reanimated (native)\",\n \"Simplified transform syntax: { x, y, scale, rotate }\",\n \"Duration tokens: 'instant', 'fast', 'normal', 'slow', 'verySlow'\",\n \"Easing presets: 'linear', 'easeIn', 'easeOut', 'easeInOut', 'spring'\",\n \"Platform-specific overrides for fine-tuned control\",\n ],\n quickStart: `import { View } from '@idealyst/components';\nimport { withAnimated, useAnimatedStyle, usePresence } from '@idealyst/animate';\n\n// Wrap components for native animations\nconst AnimatedView = withAnimated(View);\n\nfunction FadeInComponent({ isVisible }: { isVisible: boolean }) {\n // State-driven animation with simplified transform syntax\n const style = useAnimatedStyle({\n opacity: isVisible ? 1 : 0,\n transform: { y: isVisible ? 0 : 20 },\n }, {\n duration: 'normal',\n easing: 'easeOut',\n });\n\n return <AnimatedView style={style}>Content</AnimatedView>;\n}\n\nfunction ModalContent({ isOpen }: { isOpen: boolean }) {\n // Mount/unmount animation\n const { isPresent, style } = usePresence(isOpen, {\n enter: { opacity: 1, transform: { y: 0, scale: 1 } },\n exit: { opacity: 0, transform: { y: -20, scale: 0.95 } },\n duration: 'fast',\n });\n\n return isPresent && <AnimatedView style={style}>Modal</AnimatedView>;\n}`,\n apiHighlights: [\n \"useAnimatedStyle(style, options) - Animate style changes\",\n \"usePresence(isVisible, { enter, exit }) - Mount/unmount animations\",\n \"useAnimatedValue(initial) - Imperative animated values\",\n \"useGradientBorder(options) - Animated gradient borders\",\n \"withAnimated(Component) - HOC for native (no-op on web)\",\n \"TransformObject: { x, y, scale, rotate, ... }\",\n \"Duration: 'instant' | 'fast' | 'normal' | 'slow' | 'verySlow'\",\n \"EasingKey: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'spring' | ...\",\n ],\n relatedPackages: [\"theme\", \"components\"],\n },\n\n lottie: {\n name: \"Lottie\",\n npmName: \"@idealyst/lottie\",\n description:\n \"Cross-platform Lottie animation component for React and React Native. Renders After Effects animations using lottie-web on web and lottie-react-native on native.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/lottie lottie-web lottie-react-native\",\n peerDependencies: [\"lottie-web (web)\", \"lottie-react-native (native)\"],\n features: [\n \"Render After Effects animations from JSON\",\n \"URL, imported JSON, or require() sources\",\n \"Imperative ref API for playback control\",\n \"Autoplay, loop, and speed configuration\",\n \"Resize modes (cover, contain, center)\",\n \"Segment playback for partial animations\",\n \"Frame-level control and progress tracking\",\n \"Event callbacks (onComplete, onLoad, onError)\",\n \"Direction control (forward/reverse)\",\n ],\n quickStart: `import { Lottie, LottieRef } from '@idealyst/lottie';\nimport { useRef } from 'react';\n\n// Basic usage with URL\n<Lottie\n source=\"https://assets.example.com/animation.json\"\n autoPlay\n loop\n/>\n\n// With imported JSON\nimport animationData from './animation.json';\n<Lottie source={animationData} autoPlay />\n\n// With ref for imperative control\nfunction AnimatedComponent() {\n const lottieRef = useRef<LottieRef>(null);\n\n return (\n <>\n <Lottie\n ref={lottieRef}\n source={animationData}\n onComplete={() => console.log('Animation complete')}\n />\n <Button onPress={() => lottieRef.current?.play()}>Play</Button>\n <Button onPress={() => lottieRef.current?.pause()}>Pause</Button>\n <Button onPress={() => lottieRef.current?.setProgress(0.5)}>\n Go to 50%\n </Button>\n </>\n );\n}`,\n apiHighlights: [\n \"Lottie component\",\n \"LottieRef.play() / pause() / stop()\",\n \"LottieRef.setProgress(0-1)\",\n \"LottieRef.goToAndPlay(frame) / goToAndStop(frame)\",\n \"LottieRef.playSegments(start, end)\",\n \"LottieRef.setSpeed(speed) / setDirection(1 | -1)\",\n \"LottieRef.getCurrentFrame() / getTotalFrames()\",\n \"LottieSource: string | LottieJSON | { uri: string }\",\n \"ResizeMode: 'cover' | 'contain' | 'center'\",\n ],\n relatedPackages: [\"components\", \"animate\"],\n },\n\n charts: {\n name: \"Charts\",\n npmName: \"@idealyst/charts\",\n description:\n \"Cross-platform animated charting library for React and React Native. Supports line, bar, area, pie, scatter, and candlestick charts with dual-renderer architecture (SVG for web, Skia for native).\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/charts @idealyst/theme @idealyst/svg\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"@idealyst/svg\",\n \"react-native-reanimated (native)\",\n \"react-native-gesture-handler (native)\",\n \"@shopify/react-native-skia (native, optional)\",\n ],\n features: [\n \"LineChart - Time series, trends with multiple curve types (linear, monotone, step)\",\n \"BarChart - Vertical/horizontal, grouped, stacked with staggered animations\",\n \"PieChart/DonutChart - Segment reveal animations (coming soon)\",\n \"AreaChart - Filled area with gradient support (coming soon)\",\n \"ScatterChart - Point clouds (coming soon)\",\n \"CandlestickChart - OHLC financial data (coming soon)\",\n \"Dual-renderer: SVG (web default) and Skia (native GPU-accelerated)\",\n \"Full animation support - entrance, transitions, interactions\",\n \"Theme integration - intent-based colors, dark mode\",\n \"Touch/mouse interactions - tooltips, selection\",\n \"Zoom/pan support (coming soon)\",\n \"Scale utilities - linear, band, time scales\",\n \"Responsive container sizing\",\n ],\n quickStart: `import { LineChart, BarChart, ChartProvider } from '@idealyst/charts';\n\n// Basic Line Chart with animation\n<LineChart\n data={[{\n id: 'revenue',\n name: 'Revenue',\n intent: 'primary',\n data: [\n { x: 'Jan', y: 100 },\n { x: 'Feb', y: 150 },\n { x: 'Mar', y: 120 },\n ],\n }]}\n height={300}\n curve=\"monotone\"\n showDots\n showArea\n animate\n/>\n\n// Animated Bar Chart with stagger effect\n<BarChart\n data={[{\n id: 'sales',\n name: 'Sales',\n intent: 'success',\n data: [\n { x: 'Q1', y: 120 },\n { x: 'Q2', y: 180 },\n { x: 'Q3', y: 150 },\n ],\n }]}\n height={300}\n animate\n barRadius={4}\n/>\n\n// App-wide chart defaults\n<ChartProvider renderer=\"svg\" defaultIntent=\"primary\">\n <App />\n</ChartProvider>`,\n apiHighlights: [\n \"LineChart - Line/area charts with curve interpolation\",\n \"BarChart - Bar charts with grouping/stacking\",\n \"ChartContainer - Responsive container with padding\",\n \"ChartProvider - App-wide renderer and defaults\",\n \"XAxis, YAxis, GridLines - Axis components\",\n \"useChartAnimation() - Custom animation hook\",\n \"useStaggeredAnimation() - Staggered entrance animations\",\n \"createLinearScale() - Numeric value scaling\",\n \"createBandScale() - Categorical scaling\",\n \"createTimeScale() - Date/time scaling\",\n \"generateLinePath() - SVG path generation\",\n \"CurveType: 'linear' | 'monotone' | 'step' | 'cardinal'\",\n \"Data: { id, name, intent?, color?, data: [{ x, y }] }\",\n ],\n relatedPackages: [\"theme\", \"svg\", \"animate\"],\n },\n\n \"files\": {\n name: \"Files\",\n npmName: \"@idealyst/files\",\n description:\n \"Cross-platform file picker, upload, and local file management for React and React Native. Supports chunked uploads for large files, background uploads on native, progress tracking, and retry logic.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation:\n \"yarn add @idealyst/files react-native-document-picker react-native-image-picker react-native-blob-util\",\n peerDependencies: [\n \"react-native-document-picker (native)\",\n \"react-native-image-picker (native)\",\n \"react-native-blob-util (native)\",\n ],\n features: [\n \"Cross-platform file picker with type filtering\",\n \"Camera capture support (native)\",\n \"Drag and drop support (web)\",\n \"Upload queue with concurrency control\",\n \"Progress tracking with speed and ETA\",\n \"Chunked uploads for large files (>50MB)\",\n \"Background uploads on native\",\n \"Automatic retry with exponential backoff\",\n \"Presets for common scenarios (avatar, documents, images)\",\n \"TypeScript-first with full type definitions\",\n ],\n quickStart: `import { useFilePicker, useFileUpload, FilePickerButton, UploadProgress } from '@idealyst/files';\n\nfunction UploadForm() {\n const { addFiles, uploads } = useFileUpload({ autoStart: true });\n\n return (\n <View>\n <FilePickerButton\n pickerConfig={{ allowedTypes: ['image'], multiple: true }}\n onPick={(result) => {\n if (!result.cancelled) {\n addFiles(result.files, {\n url: 'https://api.example.com/upload',\n fieldName: 'file',\n });\n }\n }}\n >\n Select Images\n </FilePickerButton>\n\n {uploads.map(upload => (\n <UploadProgress\n key={upload.id}\n upload={upload}\n showSpeed\n showETA\n />\n ))}\n </View>\n );\n}`,\n apiHighlights: [\n \"useFilePicker() - File selection hook. Returns { pick, files, isPicking }. Method is pick() — NOT pickFiles()\",\n \"useFileUpload() - Upload management hook\",\n \"FilePickerButton - Styled file picker button\",\n \"DropZone - Drag and drop area (web)\",\n \"UploadProgress - Progress indicator component\",\n \"FileType = 'image' | 'video' | 'audio' | 'document' | 'archive' | 'any' — NOT 'pdf', 'doc', 'xlsx'\",\n \"PickedFile has dimensions?: { width, height } — NOT top-level width/height\",\n \"FILE_PICKER_PRESETS - Common file type configs\",\n \"UPLOAD_PRESETS - Upload behavior presets\",\n \"Use customMimeTypes for specific formats like 'application/pdf'\",\n ],\n relatedPackages: [\"components\", \"camera\", \"storage\"],\n },\n};\n\n/**\n * Get all packages grouped by category\n */\nexport function getPackagesByCategory(): Record<string, PackageInfo[]> {\n const grouped: Record<string, PackageInfo[]> = {};\n\n for (const pkg of Object.values(packages)) {\n if (!grouped[pkg.category]) {\n grouped[pkg.category] = [];\n }\n grouped[pkg.category].push(pkg);\n }\n\n return grouped;\n}\n\n/**\n * Get a summary list of all packages\n */\nexport function getPackageSummary(): Array<{\n name: string;\n npmName: string;\n category: string;\n description: string;\n platforms: string[];\n documentationStatus: string;\n}> {\n return Object.entries(packages).map(([key, pkg]) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n}\n\n/**\n * Search packages by query\n */\nexport function searchPackages(query: string): PackageInfo[] {\n const lowerQuery = query.toLowerCase();\n\n return Object.values(packages).filter(\n (pkg) =>\n pkg.name.toLowerCase().includes(lowerQuery) ||\n pkg.npmName.toLowerCase().includes(lowerQuery) ||\n pkg.description.toLowerCase().includes(lowerQuery) ||\n pkg.features.some((f) => f.toLowerCase().includes(lowerQuery)) ||\n pkg.category.toLowerCase().includes(lowerQuery)\n );\n}\n","/**\n * Auth Recipes - Login, signup, and authentication patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const authRecipes: Record<string, Recipe> = {\n \"login-form\": {\n name: \"Login Form\",\n description: \"A complete login form with email/password validation and error handling\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, TextInput, Card, Text, View } from '@idealyst/components';\n\ninterface LoginFormProps {\n onSubmit: (email: string, password: string) => Promise<void>;\n onForgotPassword?: () => void;\n}\n\nexport function LoginForm({ onSubmit, onForgotPassword }: LoginFormProps) {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [errors, setErrors] = useState<{ email?: string; password?: string }>({});\n const [isLoading, setIsLoading] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const validate = () => {\n const newErrors: typeof errors = {};\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n setSubmitError(null);\n\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit(email, password);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : 'Login failed');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"h5\" weight=\"bold\" style={{ marginBottom: 24 }}>\n Sign In\n </Text>\n\n {submitError && (\n <View style={{ marginBottom: 16 }}>\n <Text typography=\"body2\" color=\"danger\">{submitError}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n inputMode=\"email\"\n autoCapitalize=\"none\"\n textContentType=\"emailAddress\"\n intent={errors.email ? 'danger' : undefined}\n />\n {errors.email && <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Password</Text>\n <TextInput\n placeholder=\"Enter your password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n textContentType=\"password\"\n intent={errors.password ? 'danger' : undefined}\n />\n {errors.password && <Text typography=\"body2\" color=\"danger\">{errors.password}</Text>}\n </View>\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Sign In\n </Button>\n\n {onForgotPassword && (\n <Button type=\"text\" onPress={onForgotPassword}>\n Forgot Password?\n </Button>\n )}\n </View>\n </Card>\n );\n}`,\n explanation: `This login form demonstrates:\n- Controlled inputs with useState\n- Client-side validation with error messages\n- Loading state during submission\n- Error handling for failed login attempts\n- Proper keyboard types and autocomplete hints for better UX`,\n tips: [\n \"Add onBlur validation for immediate feedback\",\n \"Consider using react-hook-form for complex forms\",\n \"Store tokens securely using @idealyst/storage after successful login\",\n ],\n relatedRecipes: [\"signup-form\", \"forgot-password\", \"protected-route\"],\n },\n\n \"signup-form\": {\n name: \"Signup Form\",\n description: \"User registration form with password confirmation and terms acceptance\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, TextInput, Card, Text, View, Checkbox, Link } from '@idealyst/components';\n\ninterface SignupFormProps {\n onSubmit: (data: { name: string; email: string; password: string }) => Promise<void>;\n onTermsPress?: () => void;\n}\n\nexport function SignupForm({ onSubmit, onTermsPress }: SignupFormProps) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [acceptedTerms, setAcceptedTerms] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const validate = () => {\n const newErrors: Record<string, string> = {};\n\n if (!name.trim()) {\n newErrors.name = 'Name is required';\n }\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n if (password !== confirmPassword) {\n newErrors.confirmPassword = 'Passwords do not match';\n }\n\n if (!acceptedTerms) {\n newErrors.terms = 'You must accept the terms and conditions';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit({ name, email, password });\n } catch (error) {\n setErrors({ submit: error instanceof Error ? error.message : 'Signup failed' });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"h5\" weight=\"bold\" style={{ marginBottom: 24 }}>\n Create Account\n </Text>\n\n {errors.submit && (\n <View style={{ marginBottom: 16 }}>\n <Text typography=\"body2\" color=\"danger\">{errors.submit}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Full Name</Text>\n <TextInput\n placeholder=\"John Doe\"\n value={name}\n onChangeText={setName}\n textContentType=\"name\"\n intent={errors.name ? 'danger' : undefined}\n />\n {errors.name && <Text typography=\"body2\" color=\"danger\">{errors.name}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n inputMode=\"email\"\n autoCapitalize=\"none\"\n textContentType=\"emailAddress\"\n intent={errors.email ? 'danger' : undefined}\n />\n {errors.email && <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Password</Text>\n <TextInput\n placeholder=\"At least 8 characters\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n textContentType=\"newPassword\"\n intent={errors.password ? 'danger' : undefined}\n />\n {errors.password && <Text typography=\"body2\" color=\"danger\">{errors.password}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Confirm Password</Text>\n <TextInput\n placeholder=\"Confirm your password\"\n value={confirmPassword}\n onChangeText={setConfirmPassword}\n secureTextEntry\n textContentType=\"newPassword\"\n intent={errors.confirmPassword ? 'danger' : undefined}\n />\n {errors.confirmPassword && <Text typography=\"body2\" color=\"danger\">{errors.confirmPassword}</Text>}\n </View>\n\n <Checkbox\n checked={acceptedTerms}\n onChange={setAcceptedTerms}\n error={errors.terms}\n >\n <Text typography=\"body2\">\n I agree to the{' '}\n <Link to=\"/terms\" onPress={onTermsPress}>Terms and Conditions</Link>\n </Text>\n </Checkbox>\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Create Account\n </Button>\n </View>\n </Card>\n );\n}`,\n explanation: `This signup form includes:\n- Multiple field validation including password matching\n- Terms and conditions checkbox with validation\n- Proper autocomplete hints for password managers\n- Loading and error states`,\n tips: [\n \"Add password strength indicator for better UX\",\n \"Consider email verification flow after signup\",\n \"Use secure password hashing on the backend\",\n ],\n relatedRecipes: [\"login-form\", \"email-verification\"],\n },\n\n \"protected-route\": {\n name: \"Protected Route\",\n description: \"Route guard that redirects unauthenticated users\",\n category: \"auth\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React, { useEffect } from 'react';\nimport { View, ActivityIndicator } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n isAuthenticated: boolean;\n isLoading?: boolean;\n redirectTo?: string;\n}\n\nexport function ProtectedRoute({\n children,\n isAuthenticated,\n isLoading = false,\n redirectTo = '/login',\n}: ProtectedRouteProps) {\n const { navigate } = useNavigator();\n\n useEffect(() => {\n if (!isLoading && !isAuthenticated) {\n navigate({ path: redirectTo, replace: true });\n }\n }, [isAuthenticated, isLoading, navigate, redirectTo]);\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n if (!isAuthenticated) {\n return null;\n }\n\n return <>{children}</>;\n}\n\n// Usage with auth context\nimport { useAuth } from './AuthContext';\n\nfunction DashboardScreen() {\n const { isAuthenticated, isLoading } = useAuth();\n\n return (\n <ProtectedRoute isAuthenticated={isAuthenticated} isLoading={isLoading}>\n <DashboardContent />\n </ProtectedRoute>\n );\n}`,\n explanation: `Protected routes prevent unauthorized access:\n- Checks authentication state\n- Shows loading indicator while checking\n- Redirects to login if not authenticated\n- Renders children only when authenticated`,\n tips: [\n \"Store redirect URL to return after login\",\n \"Use React Context for global auth state\",\n \"Consider role-based access for admin routes\",\n ],\n relatedRecipes: [\"login-form\", \"auth-context\"],\n },\n};\n","/**\n * Settings Recipes - App settings and preferences\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const settingsRecipes: Record<string, Recipe> = {\n \"settings-screen\": {\n name: \"Settings Screen\",\n description: \"App settings screen with toggles, selections, and grouped options\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { useState, useEffect } from 'react';\nimport {\n Screen, View, Text, Switch, Select, Card, Divider, Icon,\n} from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { ThemeSettings } from '@idealyst/theme';\nimport { storage } from '@idealyst/storage';\n\ninterface Settings {\n notifications: boolean;\n emailUpdates: boolean;\n darkMode: boolean;\n language: string;\n fontSize: string;\n}\n\nconst defaultSettings: Settings = {\n notifications: true,\n emailUpdates: false,\n darkMode: false,\n language: 'en',\n fontSize: 'medium',\n};\n\nexport function SettingsScreen() {\n const [settings, setSettings] = useState<Settings>(defaultSettings);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n loadSettings();\n }, []);\n\n const loadSettings = async () => {\n try {\n const raw = await storage.getItem('user-settings');\n if (raw) {\n setSettings(JSON.parse(raw) as Settings);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const updateSetting = async <K extends keyof Settings>(\n key: K,\n value: Settings[K]\n ) => {\n const newSettings = { ...settings, [key]: value };\n setSettings(newSettings);\n await storage.setItem('user-settings', JSON.stringify(newSettings));\n\n // Apply dark mode toggle immediately\n if (key === 'darkMode') {\n const isDark = value as boolean;\n ThemeSettings.setAdaptiveThemes(false);\n // setTheme(lightTheme, darkTheme) — pass same value for both to force a single mode\n ThemeSettings.setTheme(isDark ? 'dark' : 'light', isDark ? 'dark' : 'light');\n }\n };\n\n if (isLoading) {\n return (\n <Screen safeArea padding=\"md\">\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text typography=\"body1\">Loading...</Text>\n </View>\n </Screen>\n );\n }\n\n return (\n <Screen scrollable safeArea padding=\"md\">\n <View gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">Settings</Text>\n\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"h6\" weight=\"semibold\">Notifications</Text>\n\n <SettingRow icon=\"bell\" label=\"Push Notifications\" description=\"Receive push notifications\">\n <Switch\n checked={settings.notifications}\n onChange={(v) => updateSetting('notifications', v)}\n />\n </SettingRow>\n\n <Divider spacing=\"xs\" />\n\n <SettingRow icon=\"email\" label=\"Email Updates\" description=\"Receive weekly email updates\">\n <Switch\n checked={settings.emailUpdates}\n onChange={(v) => updateSetting('emailUpdates', v)}\n />\n </SettingRow>\n </Card>\n\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"h6\" weight=\"semibold\">Appearance</Text>\n\n <SettingRow icon=\"theme-light-dark\" label=\"Dark Mode\" description=\"Use dark theme\">\n <Switch\n checked={settings.darkMode}\n onChange={(v) => updateSetting('darkMode', v)}\n />\n </SettingRow>\n\n <Divider spacing=\"xs\" />\n\n <SettingRow icon=\"format-size\" label=\"Font Size\">\n <Select\n value={settings.fontSize}\n onChange={(v) => updateSetting('fontSize', v)}\n options={[\n { label: 'Small', value: 'small' },\n { label: 'Medium', value: 'medium' },\n { label: 'Large', value: 'large' },\n ]}\n />\n </SettingRow>\n </Card>\n </View>\n </Screen>\n );\n}\n\nfunction SettingRow({ icon, label, description, children }: {\n icon: IconName;\n label: string;\n description?: string;\n children?: React.ReactNode;\n}) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12, flex: 1 }}>\n <Icon name={icon} size=\"sm\" />\n <View style={{ flex: 1 }}>\n <Text typography=\"body1\">{label}</Text>\n {description && <Text typography=\"caption\" color=\"tertiary\">{description}</Text>}\n </View>\n </View>\n {children}\n </View>\n );\n}`,\n explanation: `This settings screen demonstrates:\n- Loading and persisting settings with @idealyst/storage\n- Grouped settings sections with Cards\n- Switch toggles for boolean options\n- Select dropdowns for choices\n- Reusable SettingRow component with IconName typing\n- Theme switching via ThemeSettings (not direct Unistyles)`,\n tips: [\n \"Consider debouncing saves for rapid toggles\",\n \"Add a 'Reset to Defaults' option\",\n \"Use IconName type (not string) when passing icon names through props\",\n \"Use ThemeSettings.setTheme() for theme switching — never import from react-native-unistyles\",\n \"Button uses leftIcon/rightIcon — NOT icon. <Button leftIcon=\\\"check\\\">Save</Button>\",\n ],\n relatedRecipes: [\"theme-switcher\", \"profile-screen\"],\n },\n\n \"theme-switcher\": {\n name: \"Theme Switcher\",\n description: \"Toggle between light and dark mode with persistence\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { ThemeSettings, getColorScheme } from '@idealyst/theme';\nimport { storage } from '@idealyst/storage';\nimport { Switch, View, Text, Icon, Pressable } from '@idealyst/components';\n\ntype ThemeMode = 'light' | 'dark' | 'system';\n\ninterface ThemeContextType {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n isDark: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [mode, setModeState] = useState<ThemeMode>('system');\n const [isLoaded, setIsLoaded] = useState(false);\n\n useEffect(() => {\n loadTheme();\n }, []);\n\n useEffect(() => {\n if (!isLoaded) return;\n\n if (mode === 'system') {\n ThemeSettings.setAdaptiveThemes(true);\n } else {\n ThemeSettings.setAdaptiveThemes(false);\n // setTheme(lightTheme, darkTheme) — pass same value for both to force a single mode\n ThemeSettings.setTheme(mode, mode);\n }\n }, [mode, isLoaded]);\n\n const loadTheme = async () => {\n const saved = await storage.getItem('theme-mode');\n if (saved) setModeState(saved as ThemeMode);\n setIsLoaded(true);\n };\n\n const setMode = async (newMode: ThemeMode) => {\n setModeState(newMode);\n await storage.setItem('theme-mode', newMode);\n };\n\n const isDark = mode === 'dark' ||\n (mode === 'system' && getColorScheme() === 'dark');\n\n if (!isLoaded) return null;\n\n return (\n <ThemeContext.Provider value={{ mode, setMode, isDark }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeMode() {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useThemeMode must be used within ThemeProvider');\n return context;\n}\n\nexport function ThemeToggle() {\n const { isDark, setMode } = useThemeMode();\n\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Icon name={isDark ? 'weather-night' : 'weather-sunny'} size=\"sm\" />\n <Text typography=\"body1\">Dark Mode</Text>\n <Switch\n checked={isDark}\n onChange={(checked) => setMode(checked ? 'dark' : 'light')}\n />\n </View>\n );\n}\n\nexport function ThemeSelector() {\n const { mode, setMode } = useThemeMode();\n\n return (\n <View gap=\"sm\">\n {(['light', 'dark', 'system'] as const).map((m) => (\n <Pressable key={m} onPress={() => setMode(m)}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 12,\n borderRadius: 8,\n backgroundColor: mode === m ? 'rgba(0,0,0,0.1)' : 'transparent',\n }}\n >\n <Icon\n name={m === 'light' ? 'weather-sunny' : m === 'dark' ? 'weather-night' : 'cellphone'}\n size=\"sm\"\n />\n <Text typography=\"body1\" style={{ textTransform: 'capitalize' }}>{m}</Text>\n {mode === m && <Icon name=\"check\" size=\"sm\" intent=\"success\" />}\n </View>\n </Pressable>\n ))}\n </View>\n );\n}`,\n explanation: `This theme switcher provides:\n- ThemeProvider context for app-wide theme state\n- Persistence with @idealyst/storage\n- Support for light, dark, and system-follow modes\n- Uses ThemeSettings and getColorScheme from @idealyst/theme (not Unistyles directly)\n- Both simple toggle and full selector UI components`,\n tips: [\n \"Wrap your app root with ThemeProvider\",\n \"The system option follows device settings automatically via ThemeSettings.setAdaptiveThemes()\",\n \"Theme changes are instant with no reload required\",\n \"Never import from react-native-unistyles — use @idealyst/theme utilities instead\",\n ],\n relatedRecipes: [\"settings-screen\"],\n },\n\n \"profile-screen\": {\n name: \"Profile Screen\",\n description:\n \"User profile screen with avatar, info display, edit form, and skeleton loading state\",\n category: \"settings\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState } from 'react';\nimport {\n Screen, View, Text, TextInput, TextArea, Button, Card,\n Avatar, Icon, Skeleton, Divider, Pressable,\n} from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\n\ninterface UserProfile {\n name: string;\n email: string;\n bio: string;\n avatarUrl: string;\n}\n\nconst mockUser: UserProfile = {\n name: 'Jane Doe',\n email: 'jane@example.com',\n bio: 'Software engineer who loves building cross-platform apps.',\n avatarUrl: 'https://i.pravatar.cc/150?u=jane',\n};\n\nexport function ProfileScreen() {\n const [user, setUser] = useState<UserProfile | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [editData, setEditData] = useState<UserProfile>(mockUser);\n const [isLoading, setIsLoading] = useState(true);\n\n // Simulate data loading\n React.useEffect(() => {\n const timer = setTimeout(() => {\n setUser(mockUser);\n setIsLoading(false);\n }, 1500);\n return () => clearTimeout(timer);\n }, []);\n\n if (isLoading) {\n return (\n <Screen safeArea padding=\"md\">\n <ProfileSkeleton />\n </Screen>\n );\n }\n\n if (!user) return null;\n\n const handleSave = () => {\n setUser(editData);\n setIsEditing(false);\n };\n\n return (\n <Screen scrollable safeArea padding=\"md\">\n <View gap=\"md\">\n {/* Profile Header */}\n <Card padding=\"lg\">\n <View style={{ alignItems: 'center' }} gap=\"sm\">\n <Avatar src={user.avatarUrl} fallback={user.name.slice(0, 2)} size=\"xl\" />\n <Text typography=\"h5\" weight=\"bold\">{user.name}</Text>\n <Text typography=\"body2\" color=\"secondary\">{user.email}</Text>\n {user.bio ? (\n <Text typography=\"body2\" style={{ textAlign: 'center' }}>{user.bio}</Text>\n ) : null}\n </View>\n </Card>\n\n {/* Edit Profile Section */}\n {isEditing ? (\n <Card padding=\"md\">\n <Text typography=\"h6\" weight=\"semibold\" style={{ marginBottom: 16 }}>Edit Profile</Text>\n <View gap=\"md\">\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Name</Text>\n <TextInput\n value={editData.name}\n onChangeText={(v) => setEditData({ ...editData, name: v })}\n placeholder=\"Your name\"\n />\n </View>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n value={editData.email}\n onChangeText={(v) => setEditData({ ...editData, email: v })}\n placeholder=\"you@example.com\"\n inputMode=\"email\"\n autoCapitalize=\"none\"\n />\n </View>\n <TextArea\n label=\"Bio\"\n value={editData.bio}\n onChange={(v) => setEditData({ ...editData, bio: v })}\n placeholder=\"Tell us about yourself...\"\n rows={3}\n />\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => setIsEditing(false)} type=\"outlined\" style={{ flex: 1 }}>\n Cancel\n </Button>\n <Button onPress={handleSave} intent=\"primary\" style={{ flex: 1 }}>\n Save\n </Button>\n </View>\n </View>\n </Card>\n ) : (\n <Button\n onPress={() => { setEditData(user); setIsEditing(true); }}\n type=\"outlined\"\n leftIcon=\"account-edit\"\n >\n Edit Profile\n </Button>\n )}\n\n {/* Profile Menu */}\n <Card padding=\"md\" gap=\"xs\">\n <ProfileMenuItem icon=\"cog\" label=\"Settings\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"bell\" label=\"Notifications\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"shield-check\" label=\"Privacy\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"help-circle\" label=\"Help & Support\" onPress={() => {}} />\n </Card>\n\n <Button onPress={() => {}} intent=\"danger\" type=\"text\" leftIcon=\"logout\">\n Log Out\n </Button>\n </View>\n </Screen>\n );\n}\n\nfunction ProfileMenuItem({ icon, label, onPress }: {\n icon: IconName;\n label: string;\n onPress: () => void;\n}) {\n return (\n <Pressable onPress={onPress}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Icon name={icon} size=\"sm\" />\n <Text typography=\"body1\">{label}</Text>\n </View>\n <Icon name=\"chevron-right\" size=\"sm\" />\n </View>\n </Pressable>\n );\n}\n\nfunction ProfileSkeleton() {\n return (\n <View gap=\"md\">\n <Card padding=\"lg\">\n <View style={{ alignItems: 'center' }} gap=\"sm\">\n <Skeleton shape=\"circle\" width={80} height={80} />\n <Skeleton width={150} height={16} />\n <Skeleton width={200} height={14} />\n <Skeleton width={250} height={14} />\n </View>\n </Card>\n <Skeleton width=\"100%\" height={48} shape=\"rounded\" />\n <Card padding=\"md\" gap=\"sm\">\n <Skeleton width=\"100%\" height={48} />\n <Skeleton width=\"100%\" height={48} />\n <Skeleton width=\"100%\" height={48} />\n </Card>\n </View>\n );\n}`,\n explanation: `This profile screen demonstrates:\n- User info display with Avatar, name, email, and bio\n- Inline edit form toggling with TextInput and TextArea\n- Skeleton loading state while user data loads\n- Pressable menu items with icons (NOT View with onPress)\n- IconName typing for icon props (NOT string)\n- Button with leftIcon/rightIcon (NOT icon prop)\n- Card used as simple container (NO Card.Content/Card.Header)`,\n tips: [\n \"Use Pressable for interactive rows — View does NOT have onPress\",\n \"Avatar uses src for image URL and fallback for initials\",\n \"TextInput does NOT have label/error props — compose with Text + View\",\n \"TextArea DOES have label and error props\",\n \"Use leftIcon on Button, not icon: <Button leftIcon=\\\"edit\\\">Edit</Button>\",\n \"Skeleton uses 'shape' prop: 'rectangle' | 'circle' | 'rounded' (NOT 'variant')\",\n ],\n relatedRecipes: [\"settings-screen\", \"form-with-validation\", \"skeleton-loading\"],\n },\n};\n","/**\n * Navigation Recipes - Tab, drawer, stack, and responsive navigation patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const navigationRecipes: Record<string, Recipe> = {\n \"tab-navigation\": {\n name: \"Tab Navigation\",\n description: \"Bottom tab navigation with icons and badges\",\n category: \"navigation\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { NavigatorProvider } from '@idealyst/navigation';\nimport type { TabNavigatorParam } from '@idealyst/navigation';\nimport { Icon, View, Text, Card } from '@idealyst/components';\n\nfunction HomeScreen() {\n return (\n <View style={{ flex: 1, padding: 16 }} gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">Home</Text>\n {/* Card is a simple container — NO Card.Content, Card.Header, etc. Just put children inside */}\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"subtitle1\" weight=\"semibold\">Welcome</Text>\n <Text typography=\"body2\" color=\"secondary\">This is the home screen</Text>\n </Card>\n </View>\n );\n}\n\nfunction SearchScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Search</Text></View>;\n}\n\nfunction NotificationsScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Notifications</Text></View>;\n}\n\nfunction ProfileScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Profile</Text></View>;\n}\n\nconst route: TabNavigatorParam = {\n type: 'navigator',\n path: '/',\n layout: 'tab',\n routes: [\n {\n type: 'screen',\n path: '/',\n component: HomeScreen,\n options: {\n title: 'Home',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'home' : 'home-outline'} size=\"sm\" />\n ),\n },\n },\n {\n type: 'screen',\n path: '/search',\n component: SearchScreen,\n options: {\n title: 'Search',\n tabBarIcon: ({ focused }) => (\n <Icon name=\"magnify\" size=\"sm\" />\n ),\n },\n },\n {\n type: 'screen',\n path: '/notifications',\n component: NotificationsScreen,\n options: {\n title: 'Notifications',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'bell' : 'bell-outline'} size=\"sm\" />\n ),\n tabBarBadge: 3,\n },\n },\n {\n type: 'screen',\n path: '/profile',\n component: ProfileScreen,\n options: {\n title: 'Profile',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'account' : 'account-outline'} size=\"sm\" />\n ),\n },\n },\n ],\n};\n\nexport function App() {\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Tab navigation setup with:\n- NavigatorProvider wraps the app with a route configuration object\n- TabNavigatorParam defines the tab layout with routes array\n- Each route has type: 'screen', a path, component, and options\n- tabBarIcon renders icons that change when focused\n- tabBarBadge shows a badge count on the tab\n- Works on both web and native`,\n tips: [\n \"Use outline/filled icon variants to indicate focus state\",\n \"Keep tab count to 3-5 for best usability\",\n \"Use tabBarBadge for notification counts instead of manual Badge component\",\n \"Nest a StackNavigatorParam inside a tab route for detail screens\",\n \"Card is a plain container — put children directly inside <Card>. There are NO Card.Content, Card.Header, or Card.Body sub-components\",\n ],\n relatedRecipes: [\"drawer-navigation\", \"responsive-navigation\"],\n },\n\n \"drawer-navigation\": {\n name: \"Drawer Navigation\",\n description: \"Side drawer menu with navigation items and user profile\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { NavigatorProvider, useNavigator } from '@idealyst/navigation';\nimport type { DrawerNavigatorParam, DrawerSidebarProps } from '@idealyst/navigation';\nimport { View, Text, Icon, Avatar, Pressable, Divider } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\n\nfunction HomeScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Home</Text></View>;\n}\n\nfunction DashboardScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Dashboard</Text></View>;\n}\n\nfunction SettingsScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Settings</Text></View>;\n}\n\nfunction DrawerContent(props: DrawerSidebarProps) {\n const { navigate } = useNavigator();\n\n const menuItems: { path: string; icon: IconName; label: string }[] = [\n { path: '/', icon: 'home', label: 'Home' },\n { path: '/dashboard', icon: 'view-dashboard', label: 'Dashboard' },\n { path: '/settings', icon: 'cog', label: 'Settings' },\n ];\n\n return (\n <View style={{ flex: 1, padding: 16, paddingTop: (props.insets?.top ?? 0) + 16 }}>\n <View style={{ alignItems: 'center', paddingVertical: 24 }}>\n <Avatar src=\"https://example.com/avatar.jpg\" size=\"lg\" />\n <Text typography=\"h6\" weight=\"semibold\" style={{ marginTop: 12 }}>John Doe</Text>\n </View>\n\n <Divider style={{ marginVertical: 16 }} />\n\n <View style={{ gap: 4 }}>\n {menuItems.map((item) => (\n <Pressable key={item.path} onPress={() => navigate({ path: item.path })}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 16,\n padding: 12,\n borderRadius: 8,\n }}>\n <Icon name={item.icon} size=\"sm\" />\n <Text typography=\"body1\">{item.label}</Text>\n </View>\n </Pressable>\n ))}\n </View>\n </View>\n );\n}\n\nconst route: DrawerNavigatorParam = {\n type: 'navigator',\n path: '/',\n layout: 'drawer',\n sidebarComponent: DrawerContent,\n routes: [\n { type: 'screen', path: '/', component: HomeScreen, options: { title: 'Home' } },\n { type: 'screen', path: '/dashboard', component: DashboardScreen, options: { title: 'Dashboard' } },\n { type: 'screen', path: '/settings', component: SettingsScreen, options: { title: 'Settings' } },\n ],\n};\n\nexport function App() {\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Drawer navigation includes:\n- NavigatorProvider with a DrawerNavigatorParam configuration\n- Custom sidebarComponent for the drawer content\n- DrawerSidebarProps provides safe area insets on mobile\n- useNavigator() hook to navigate between screens\n- navigate() takes an object: { path: '/settings' }\n- Works on both web (sidebar) and native (slide-out drawer)`,\n tips: [\n \"Use DrawerSidebarProps insets to avoid notches and status bars\",\n \"Type icon props as IconName (from @idealyst/components) not string\",\n \"navigate() always takes an object with a 'path' key\",\n ],\n relatedRecipes: [\"tab-navigation\", \"responsive-navigation\"],\n },\n\n \"responsive-navigation\": {\n name: \"Responsive Navigation\",\n description: \"Adaptive navigation that switches between tabs and drawer based on screen size\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\", \"@idealyst/theme\"],\n code: `import React, { useMemo } from 'react';\nimport { NavigatorProvider } from '@idealyst/navigation';\nimport type { TabNavigatorParam, DrawerNavigatorParam, ScreenParam, TabBarScreenOptions } from '@idealyst/navigation';\nimport { useResponsiveStyle } from '@idealyst/theme';\nimport { Icon, View, Text } from '@idealyst/components';\n\nfunction HomeScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Home</Text></View>;\n}\n\nfunction SearchScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Search</Text></View>;\n}\n\n// Shared screen definitions\nconst screens: ScreenParam<TabBarScreenOptions>[] = [\n {\n type: 'screen',\n path: '/',\n component: HomeScreen,\n options: {\n title: 'Home',\n tabBarIcon: ({ focused }) => <Icon name={focused ? 'home' : 'home-outline'} size=\"sm\" />,\n },\n },\n {\n type: 'screen',\n path: '/search',\n component: SearchScreen,\n options: {\n title: 'Search',\n tabBarIcon: ({ focused }) => <Icon name=\"magnify\" size=\"sm\" />,\n },\n },\n];\n\nexport function App() {\n // useResponsiveStyle returns different values based on breakpoint\n const isLargeScreen = useResponsiveStyle({ base: false, md: true });\n\n const route = useMemo(() => {\n if (isLargeScreen) {\n return {\n type: 'navigator' as const,\n path: '/',\n layout: 'drawer' as const,\n routes: screens,\n } satisfies DrawerNavigatorParam;\n }\n return {\n type: 'navigator' as const,\n path: '/',\n layout: 'tab' as const,\n routes: screens,\n } satisfies TabNavigatorParam;\n }, [isLargeScreen]);\n\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Responsive navigation that:\n- Uses tabs on mobile/small screens\n- Switches to drawer on tablet/desktop\n- Shares screen definitions between layouts\n- Adapts automatically based on breakpoints`,\n tips: [\n \"Test on various screen sizes\",\n \"Consider tablet portrait vs landscape\",\n \"Use consistent navigation patterns within each mode\",\n ],\n relatedRecipes: [\"tab-navigation\", \"drawer-navigation\"],\n },\n};\n","/**\n * Data Recipes - Lists, filtering, and data display patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const dataRecipes: Record<string, Recipe> = {\n \"data-list\": {\n name: \"Data List\",\n description: \"Scrollable list with loading states and pull-to-refresh\",\n category: \"data\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useEffect, useCallback } from 'react';\nimport { View, Text, Card, List, ActivityIndicator } from '@idealyst/components';\n\ninterface Item {\n id: string;\n title: string;\n description: string;\n}\n\nexport function DataList() {\n const [items, setItems] = useState<Item[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const fetchData = async () => {\n // Simulated API call\n const response = await fetch('/api/items');\n const data = await response.json();\n return data;\n };\n\n useEffect(() => {\n loadData();\n }, []);\n\n const loadData = async () => {\n setIsLoading(true);\n try {\n const data = await fetchData();\n setItems(data);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n {items.length === 0 ? (\n <View style={{ padding: 32, alignItems: 'center' }}>\n <Text typography=\"body1\" color=\"tertiary\">No items found</Text>\n </View>\n ) : (\n items.map((item) => (\n <Card key={item.id} style={{ margin: 8 }}>\n <Text typography=\"subtitle1\" weight=\"semibold\">{item.title}</Text>\n <Text typography=\"body2\" color=\"secondary\">{item.description}</Text>\n </Card>\n ))\n )}\n </View>\n );\n}`,\n explanation: `Data list with:\n- Loading state with ActivityIndicator\n- Empty state handling\n- Card-based list items with proper typography\n- Uses only @idealyst/components (no react-native imports)`,\n tips: [\n \"Use the List component for virtualized rendering of large datasets\",\n \"Consider pagination for large datasets\",\n \"Add error state handling for failed requests\",\n ],\n relatedRecipes: [\"search-filter\"],\n },\n\n \"search-filter\": {\n name: \"Search & Filter\",\n description: \"Search input with real-time filtering and category filters\",\n category: \"data\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useMemo } from 'react';\nimport { View, TextInput, Chip, Text, Card, Icon } from '@idealyst/components';\n\ninterface Item {\n id: string;\n title: string;\n category: string;\n}\n\nconst categories = ['All', 'Electronics', 'Clothing', 'Books', 'Home'];\n\nexport function SearchFilter({ items }: { items: Item[] }) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState('All');\n\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n const matchesSearch = item.title\n .toLowerCase()\n .includes(searchQuery.toLowerCase());\n const matchesCategory =\n selectedCategory === 'All' || item.category === selectedCategory;\n return matchesSearch && matchesCategory;\n });\n }, [items, searchQuery, selectedCategory]);\n\n return (\n <View style={{ flex: 1 }}>\n <View style={{ padding: 16, gap: 12 }}>\n <TextInput\n placeholder=\"Search...\"\n value={searchQuery}\n onChangeText={setSearchQuery}\n />\n\n <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>\n {categories.map((category) => (\n <Chip\n key={category}\n label={category}\n selected={selectedCategory === category}\n onPress={() => setSelectedCategory(category)}\n />\n ))}\n </View>\n </View>\n\n <View style={{ padding: 16, gap: 8 }}>\n <Text typography=\"caption\" color=\"tertiary\">\n {filteredItems.length} results\n </Text>\n\n {filteredItems.map((item) => (\n <Card key={item.id}>\n <Text typography=\"body1\">{item.title}</Text>\n <Chip label={item.category} size=\"sm\" />\n </Card>\n ))}\n </View>\n </View>\n );\n}`,\n explanation: `Search and filter functionality:\n- Real-time search with TextInput\n- Category filter chips\n- Combined filtering with useMemo for performance\n- Results count display`,\n tips: [\n \"Debounce search input for API calls\",\n \"Consider fuzzy matching for better search results\",\n \"Save filter state for persistence across navigation\",\n ],\n relatedRecipes: [\"data-list\"],\n },\n\n \"trpc-feature\": {\n name: \"tRPC Feature with Prisma (Backend + Frontend)\",\n description: \"Complete pattern for adding a new tRPC API router with Prisma model, Zod validation, and UI screen to a scaffolded Idealyst monorepo workspace. Covers project structure, backend API file locations, and integration steps.\",\n category: \"data\",\n difficulty: \"advanced\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `// ============================================================\n// SCAFFOLDED PROJECT STRUCTURE (generated by \\`idealyst init\\`)\n// ============================================================\n// Understanding where files go is CRITICAL. The CLI generates this layout:\n//\n// <workspace>/\n// ├── packages/\n// │ ├── api/ <-- tRPC API server\n// │ │ ├── src/\n// │ │ │ ├── index.ts <-- exports { appRouter, AppRouter }\n// │ │ │ ├── server.ts <-- Express server, mounts tRPC at /trpc\n// │ │ │ └── trpc/\n// │ │ │ ├── trpc.ts <-- initTRPC, createContext, router, publicProcedure exports\n// │ │ │ ├── router.ts <-- re-exports appRouter from routers/index.ts\n// │ │ │ └── routers/\n// │ │ │ └── index.ts <-- appRouter = router({ ... }) definition\n// │ ├── database/ <-- Prisma database layer\n// │ │ ├── prisma/\n// │ │ │ └── schema.prisma <-- Prisma models go here\n// │ │ └── src/\n// │ │ ├── index.ts <-- exports { prisma, PrismaClient }\n// │ │ └── schemas.ts <-- Zod validation schemas\n// │ ├── shared/ <-- Shared code (types, utils)\n// │ ├── web/ <-- Web app (Vite + React)\n// │ │ └── src/utils/trpc.ts <-- tRPC client for web\n// │ └── mobile/ <-- React Native app\n// │ └── src/utils/trpc.ts <-- tRPC client for mobile\n//\n// KEY RULE: New routers go in packages/api/src/trpc/routers/\n// KEY RULE: Prisma models go in packages/database/prisma/schema.prisma\n// KEY RULE: New screens go in packages/web/src/ or packages/mobile/src/\n\n// ============================================================\n// STEP 1: Add Prisma model (packages/database/prisma/schema.prisma)\n// ============================================================\n// Append to existing schema.prisma (keep existing models):\n//\n// model Todo {\n// id String @id @default(cuid())\n// title String\n// completed Boolean @default(false)\n// createdAt DateTime @default(now())\n// updatedAt DateTime @updatedAt\n// }\n\n// ============================================================\n// STEP 2: Add Zod schema (packages/database/src/schemas.ts)\n// ============================================================\n// Append to existing schemas.ts:\n//\n// export const createTodoSchema = z.object({\n// title: z.string().min(1).max(200),\n// });\n\n// ============================================================\n// STEP 3: Create router (packages/api/src/trpc/routers/todo.ts)\n// ============================================================\n// IMPORTANT: File MUST be in packages/api/src/trpc/routers/\n// Import router and publicProcedure from '../trpc' (one level up)\nimport { z } from 'zod';\nimport { router, publicProcedure } from '../trpc';\n\nexport const todoRouter = router({\n list: publicProcedure.query(async ({ ctx }) => {\n return ctx.prisma.todo.findMany({ orderBy: { createdAt: 'desc' } });\n }),\n create: publicProcedure\n .input(z.object({ title: z.string().min(1) }))\n .mutation(async ({ ctx, input }) => {\n return ctx.prisma.todo.create({ data: input });\n }),\n toggle: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ ctx, input }) => {\n const todo = await ctx.prisma.todo.findUnique({ where: { id: input.id } });\n if (!todo) throw new Error('Todo not found');\n return ctx.prisma.todo.update({\n where: { id: input.id },\n data: { completed: !todo.completed },\n });\n }),\n delete: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ ctx, input }) => {\n return ctx.prisma.todo.delete({ where: { id: input.id } });\n }),\n});\n\n// ============================================================\n// STEP 4: Register in main router\n// ============================================================\n// Open packages/api/src/trpc/routers/index.ts (the existing appRouter)\n// Add your new router to the appRouter:\n//\n// import { todoRouter } from './todo';\n//\n// export const appRouter = router({\n// ...existingRoutes, // keep all existing routes\n// todo: todoRouter, // ADD THIS LINE\n// });\n\n// ============================================================\n// STEP 5: Frontend screen\n// ============================================================\nimport React, { useState } from 'react';\nimport { View, Text, TextInput, Button, Card, Checkbox, Pressable, Icon, ActivityIndicator } from '@idealyst/components';\n// import { trpc } from '../utils/trpc'; // from packages/web/src/utils/trpc.ts\n\ninterface Todo {\n id: string;\n title: string;\n completed: boolean;\n createdAt: string;\n}\n\nexport function TodoScreen() {\n const [newTitle, setNewTitle] = useState('');\n // Real app would use tRPC hooks:\n // const { data: todos, isLoading, refetch } = trpc.todo.list.useQuery();\n // const createMutation = trpc.todo.create.useMutation({ onSuccess: () => refetch() });\n // const toggleMutation = trpc.todo.toggle.useMutation({ onSuccess: () => refetch() });\n // const deleteMutation = trpc.todo.delete.useMutation({ onSuccess: () => refetch() });\n\n // Placeholder data for demonstration\n const todos: Todo[] = [];\n const isLoading = false;\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ flex: 1 }}>\n <Text typography=\"h5\" weight=\"bold\">Todos</Text>\n\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <View style={{ flex: 1 }}>\n <TextInput\n placeholder=\"What needs to be done?\"\n value={newTitle}\n onChangeText={setNewTitle}\n />\n </View>\n <Button\n leftIcon=\"plus\"\n onPress={() => {\n if (!newTitle.trim()) return;\n // createMutation.mutate({ title: newTitle });\n setNewTitle('');\n }}\n >\n Add\n </Button>\n </View>\n\n {todos.length === 0 ? (\n <View style={{ padding: 32, alignItems: 'center' }}>\n <Icon name=\"check-all\" size=\"lg\" color=\"secondary\" />\n <Text typography=\"body1\" color=\"secondary\" style={{ marginTop: 8 }}>\n No todos yet\n </Text>\n </View>\n ) : (\n todos.map((todo) => (\n <Card key={todo.id} padding=\"md\">\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Checkbox\n checked={todo.completed}\n onChange={() => {\n // toggleMutation.mutate({ id: todo.id });\n }}\n />\n <View style={{ flex: 1 }}>\n <Text\n typography=\"body1\"\n style={{\n textDecorationLine: todo.completed ? 'line-through' : 'none',\n opacity: todo.completed ? 0.6 : 1,\n }}\n >\n {todo.title}\n </Text>\n </View>\n <Pressable onPress={() => { /* deleteMutation.mutate({ id: todo.id }) */ }}>\n <Icon name=\"delete-outline\" color=\"red\" />\n </Pressable>\n </View>\n </Card>\n ))\n )}\n </View>\n );\n}`,\n explanation: `Complete tRPC feature integration in a scaffolded Idealyst monorepo:\n\n**Project structure** (generated by \\`idealyst init --with-api --with-prisma --with-trpc\\`):\n- \\`packages/api/src/trpc/routers/\\` -- where ALL tRPC routers live\n- \\`packages/api/src/trpc/trpc.ts\\` -- exports \\`router\\`, \\`publicProcedure\\`, \\`createContext\\`\n- \\`packages/api/src/trpc/routers/index.ts\\` -- the main \\`appRouter\\` that merges all routers\n- \\`packages/database/prisma/schema.prisma\\` -- all Prisma models\n- \\`packages/database/src/schemas.ts\\` -- Zod validation schemas\n- \\`packages/web/src/utils/trpc.ts\\` -- tRPC client hooks\n\n**Integration steps:**\n1. Add Prisma model to schema.prisma\n2. Add Zod validation schema\n3. Create feature router in packages/api/src/trpc/routers/\n4. Register router in the main appRouter (packages/api/src/trpc/routers/index.ts)\n5. Build UI screen using @idealyst/components\n6. Register screen in navigation config`,\n tips: [\n \"EXPLORE the project first: use Glob/Read to find existing files before writing new ones\",\n \"Router files MUST go in packages/api/src/trpc/routers/ -- never at the project root or src/\",\n \"Always merge new routers into the appRouter in packages/api/src/trpc/routers/index.ts\",\n \"Import router/publicProcedure from '../trpc' (relative to the routers directory)\",\n \"The tRPC client is already set up at packages/web/src/utils/trpc.ts and packages/mobile/src/utils/trpc.ts\",\n \"Card is a simple container -- put children directly inside, no Card.Content or Card.Header\",\n \"Use Pressable from @idealyst/components for touch handling (View has no onPress prop)\",\n ],\n relatedRecipes: [\"data-list\", \"search-filter\"],\n },\n};\n","/**\n * Layout Recipes - Modals, animations, toasts, and visual patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const layoutRecipes: Record<string, Recipe> = {\n \"modal-animation\": {\n name: \"Animated Modal\",\n description: \"Modal with fade and scale animation using usePresence\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React, { useState } from 'react';\nimport { View, Text, Button, Pressable } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\n\nconst AnimatedView = withAnimated(View);\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function AnimatedModal({ isOpen, onClose, children }: ModalProps) {\n const backdrop = usePresence(isOpen, {\n enter: { opacity: 1 },\n exit: { opacity: 0 },\n duration: 'fast',\n });\n\n const content = usePresence(isOpen, {\n enter: { opacity: 1, transform: { scale: 1, y: 0 } },\n exit: { opacity: 0, transform: { scale: 0.95, y: -20 } },\n duration: 'normal',\n easing: 'easeOut',\n });\n\n if (!backdrop.isPresent) return null;\n\n return (\n <View style={{\n position: 'absolute',\n top: 0, left: 0, right: 0, bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n }}>\n <Pressable onPress={onClose} style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <AnimatedView style={[{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)' }, backdrop.style]} />\n </Pressable>\n\n <AnimatedView style={[{\n backgroundColor: '#fff',\n borderRadius: 16,\n padding: 24,\n width: '90%',\n maxWidth: 400,\n }, content.style]}>\n {children}\n </AnimatedView>\n </View>\n );\n}\n\n// Usage\nfunction App() {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <View>\n <Button onPress={() => setIsOpen(true)}>Open Modal</Button>\n\n <AnimatedModal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n <Text typography=\"h5\" weight=\"bold\">Modal Title</Text>\n <Text typography=\"body1\" style={{ marginTop: 8 }}>Modal content goes here.</Text>\n <Button onPress={() => setIsOpen(false)} style={{ marginTop: 16 }}>Close</Button>\n </AnimatedModal>\n </View>\n );\n}`,\n explanation: `Animated modal with:\n- Fade backdrop animation\n- Scale and slide content animation\n- usePresence handles mount/unmount\n- Tap backdrop to dismiss`,\n tips: [\n \"Use 'fast' duration for backdrop, 'normal' for content\",\n \"Add keyboard dismiss for mobile\",\n \"Consider focus trap for accessibility\",\n ],\n relatedRecipes: [\"slide-up-sheet\", \"toast-notification\"],\n },\n\n \"slide-up-sheet\": {\n name: \"Slide-up Sheet\",\n description: \"Bottom sheet that slides up with gesture support\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React from 'react';\nimport { View, Text, Pressable } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\n\nconst AnimatedView = withAnimated(View);\n\ninterface SheetProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function SlideUpSheet({ isOpen, onClose, children }: SheetProps) {\n const backdrop = usePresence(isOpen, {\n enter: { opacity: 1 },\n exit: { opacity: 0 },\n duration: 'fast',\n });\n\n const sheet = usePresence(isOpen, {\n enter: { transform: { y: 0 } },\n exit: { transform: { y: 400 } },\n duration: 'normal',\n easing: 'easeOut',\n });\n\n if (!backdrop.isPresent) return null;\n\n return (\n <View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <Pressable onPress={onClose} style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <AnimatedView style={[{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)' }, backdrop.style]} />\n </Pressable>\n\n <AnimatedView style={[{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: '#fff',\n borderTopLeftRadius: 20,\n borderTopRightRadius: 20,\n padding: 24,\n maxHeight: '60%',\n }, sheet.style]}>\n <View style={{ width: 40, height: 4, backgroundColor: '#ccc', borderRadius: 2, alignSelf: 'center', marginBottom: 16 }} />\n {children}\n </AnimatedView>\n </View>\n );\n}`,\n explanation: `Bottom sheet with:\n- Slide-up animation from bottom\n- Backdrop fade\n- Drag handle indicator\n- Tap backdrop to dismiss`,\n tips: [\n \"Add pan gesture for drag-to-dismiss\",\n \"Use different sheet heights for different content\",\n \"Consider snap points for multi-height sheets\",\n ],\n relatedRecipes: [\"modal-animation\", \"toast-notification\"],\n },\n\n \"skeleton-loading\": {\n name: \"Skeleton Loading\",\n description: \"Placeholder skeleton UI while content loads\",\n category: \"layout\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\"],\n code: `import React from 'react';\nimport { View, Skeleton } from '@idealyst/components';\n\n// Card-shaped skeleton placeholder\nexport function CardSkeleton() {\n return (\n <View style={{ padding: 16, gap: 12, backgroundColor: '#fff', borderRadius: 8 }}>\n <Skeleton width=\"60%\" height={20} animation=\"pulse\" />\n <Skeleton width=\"100%\" height={14} animation=\"pulse\" />\n <Skeleton width=\"80%\" height={14} animation=\"pulse\" />\n </View>\n );\n}\n\n// List of skeleton cards\nexport function ListSkeleton({ count = 3 }: { count?: number }) {\n return (\n <View style={{ gap: 12 }}>\n {Array.from({ length: count }).map((_, i) => (\n <CardSkeleton key={i} />\n ))}\n </View>\n );\n}\n\n// Profile-style skeleton with avatar\nexport function ProfileSkeleton() {\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Skeleton width={48} height={48} shape=\"circle\" />\n <View style={{ flex: 1, gap: 8 }}>\n <Skeleton width=\"50%\" height={16} />\n <Skeleton width=\"30%\" height={12} />\n </View>\n </View>\n );\n}\n\n// Usage\nfunction DataScreen() {\n const { data, isLoading } = useData();\n\n if (isLoading) {\n return <ListSkeleton count={3} />;\n }\n\n return <ActualContent data={data} />;\n}`,\n explanation: `Skeleton loading using @idealyst/components Skeleton:\n- Built-in pulse/wave animations (no manual Animated API needed)\n- shape: 'rectangle' | 'circle' | 'rounded'\n- animation: 'pulse' | 'wave' | 'none'\n- Composable for any layout pattern`,\n tips: [\n \"Match skeleton dimensions to actual content for seamless transition\",\n \"Use shape='circle' for avatar placeholders\",\n \"Use animation='wave' for a shimmer effect, 'pulse' for fade\",\n \"Wrap multiple skeletons in a View with gap for consistent spacing\",\n ],\n relatedRecipes: [\"data-list\"],\n },\n\n \"shadow-card\": {\n name: \"Shadow Card\",\n description: \"Cross-platform card with consistent shadows on web, iOS, and Android\",\n category: \"layout\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { shadow } from '@idealyst/theme';\n\n// Basic shadowed card\nexport function ShadowCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#ffffff', borderRadius: 12, padding: 16 },\n shadow({ radius: 10, y: 4, opacity: 0.15 }),\n ]}>\n {children}\n </View>\n );\n}\n\n// Elevated card with larger shadow\nexport function ElevatedCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#ffffff', borderRadius: 16, padding: 20 },\n shadow({ radius: 20, y: 8, opacity: 0.2 }),\n ]}>\n {children}\n </View>\n );\n}\n\n// Colored shadow (brand accent)\nexport function AccentCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#3b82f6', borderRadius: 12, padding: 16 },\n shadow({ radius: 16, y: 6, color: '#3b82f6', opacity: 0.4 }),\n ]}>\n <Text color=\"inverse\">{children}</Text>\n </View>\n );\n}`,\n explanation: `The shadow() utility creates consistent shadows across all platforms:\n\n**Parameters:**\n- radius - Shadow size/blur (default: 10)\n- x - Horizontal offset (default: 0)\n- y - Vertical offset (default: 4)\n- color - Shadow color (default: '#000000')\n- opacity - Shadow opacity 0-1 (default: 0.15)\n\n**Platform handling:**\n- Web: CSS boxShadow with blur and spread\n- iOS: shadowColor, shadowOffset, shadowOpacity, shadowRadius\n- Android: elevation + shadowColor with alpha`,\n tips: [\n \"Use subtle shadows (opacity 0.1-0.2) for most UI elements\",\n \"Increase radius and y offset together for more 'elevation'\",\n \"Colored shadows work great for accent/brand elements\",\n \"Android elevation is approximated from radius (elevation = radius / 3)\",\n ],\n relatedRecipes: [\"modal-animation\"],\n },\n\n \"toast-notification\": {\n name: \"Toast Notification\",\n description: \"Auto-dismissing toast messages with animations\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { View, Text, Icon, Pressable } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\nimport { shadow } from '@idealyst/theme';\n\nconst AnimatedView = withAnimated(View);\n\ntype ToastType = 'success' | 'error' | 'info' | 'warning';\n\ninterface Toast {\n id: string;\n message: string;\n type: ToastType;\n}\n\nconst toastConfig: Record<ToastType, { icon: IconName; color: string }> = {\n success: { icon: 'check-circle', color: '#22c55e' },\n error: { icon: 'alert-circle', color: '#ef4444' },\n info: { icon: 'information', color: '#3b82f6' },\n warning: { icon: 'alert', color: '#f59e0b' },\n};\n\nconst ToastContext = createContext<{\n showToast: (message: string, type?: ToastType) => void;\n} | null>(null);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const showToast = useCallback((message: string, type: ToastType = 'info') => {\n const id = Date.now().toString();\n setToasts((prev) => [...prev, { id, message, type }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3000);\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast }}>\n {children}\n <View style={{ position: 'absolute', top: 50, left: 16, right: 16, gap: 8 }}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={() => setToasts((prev) => prev.filter((t) => t.id !== toast.id))} />\n ))}\n </View>\n </ToastContext.Provider>\n );\n}\n\nfunction ToastItem({ toast, onDismiss }: { toast: Toast; onDismiss: () => void }) {\n const { style, isPresent } = usePresence(true, {\n enter: { opacity: 1, transform: { y: 0 } },\n exit: { opacity: 0, transform: { y: -20 } },\n duration: 'fast',\n });\n\n const config = toastConfig[toast.type];\n\n return (\n <AnimatedView style={[{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#fff',\n padding: 12,\n borderRadius: 8,\n borderLeftWidth: 4,\n borderLeftColor: config.color,\n }, shadow({ radius: 8, y: 2, opacity: 0.1 }), style]}>\n <Icon name={config.icon} size=\"sm\" />\n <Text typography=\"body2\" style={{ flex: 1, marginLeft: 12 }}>{toast.message}</Text>\n <Pressable onPress={onDismiss}>\n <Icon name=\"close\" size=\"xs\" />\n </Pressable>\n </AnimatedView>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) throw new Error('useToast must be used within ToastProvider');\n return context;\n}`,\n explanation: `Toast notification system with:\n- Context-based toast management\n- Auto-dismiss after 3 seconds\n- Multiple toast types with colors and icons\n- Slide-in animation\n- Uses IconName type for type-safe icon references`,\n tips: [\n \"Position at top for mobile, bottom-right for desktop\",\n \"Limit to 3-5 visible toasts\",\n \"Allow manual dismiss\",\n \"Type icon props as IconName, never as string\",\n ],\n relatedRecipes: [\"modal-animation\", \"slide-up-sheet\"],\n },\n};\n","/**\n * Forms Recipes - Form validation and input patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const formsRecipes: Record<string, Recipe> = {\n \"form-with-validation\": {\n name: \"Form with Validation\",\n description: \"Comprehensive form with field validation and error display\",\n category: \"forms\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState } from 'react';\nimport { View, Text, TextInput, TextArea, Select, Button, Card } from '@idealyst/components';\n\ninterface FormData {\n name: string;\n email: string;\n phone: string;\n country: string;\n message: string;\n}\n\ninterface FormErrors {\n [key: string]: string | undefined;\n}\n\nconst initialData: FormData = {\n name: '',\n email: '',\n phone: '',\n country: '',\n message: '',\n};\n\nexport function ContactForm({ onSubmit }: { onSubmit: (data: FormData) => Promise<void> }) {\n const [data, setData] = useState<FormData>(initialData);\n const [errors, setErrors] = useState<FormErrors>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n const validateField = (name: keyof FormData, value: string): string | undefined => {\n switch (name) {\n case 'name':\n if (!value.trim()) return 'Name is required';\n if (value.length < 2) return 'Name must be at least 2 characters';\n break;\n case 'email':\n if (!value) return 'Email is required';\n if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(value)) return 'Invalid email address';\n break;\n case 'phone':\n if (value && !/^\\\\+?[0-9]{10,15}$/.test(value.replace(/\\\\s/g, ''))) return 'Invalid phone number';\n break;\n case 'country':\n if (!value) return 'Please select a country';\n break;\n case 'message':\n if (!value.trim()) return 'Message is required';\n if (value.length < 10) return 'Message must be at least 10 characters';\n break;\n }\n return undefined;\n };\n\n const handleChange = (name: keyof FormData, value: string) => {\n setData((prev) => ({ ...prev, [name]: value }));\n if (touched.has(name)) {\n setErrors((prev) => ({ ...prev, [name]: validateField(name, value) }));\n }\n };\n\n const handleBlur = (name: keyof FormData) => {\n setTouched((prev) => new Set(prev).add(name));\n setErrors((prev) => ({ ...prev, [name]: validateField(name, data[name]) }));\n };\n\n const validateAll = (): boolean => {\n const newErrors: FormErrors = {};\n (Object.keys(data) as (keyof FormData)[]).forEach((key) => {\n newErrors[key] = validateField(key, data[key]);\n });\n setErrors(newErrors);\n setTouched(new Set(Object.keys(data)));\n return !Object.values(newErrors).some(Boolean);\n };\n\n const handleSubmit = async () => {\n if (!validateAll()) return;\n\n setIsSubmitting(true);\n try {\n await onSubmit(data);\n setData(initialData);\n setTouched(new Set());\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"subtitle1\" weight=\"bold\" style={{ marginBottom: 24 }}>Contact Us</Text>\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Name</Text>\n <TextInput\n value={data.name}\n onChangeText={(v) => handleChange('name', v)}\n onBlur={() => handleBlur('name')}\n placeholder=\"Your name\"\n intent={touched.has('name') && errors.name ? 'danger' : undefined}\n />\n {touched.has('name') && errors.name && (\n <Text typography=\"body2\" color=\"danger\">{errors.name}</Text>\n )}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n value={data.email}\n onChangeText={(v) => handleChange('email', v)}\n onBlur={() => handleBlur('email')}\n placeholder=\"you@example.com\"\n inputMode=\"email\"\n autoCapitalize=\"none\"\n intent={touched.has('email') && errors.email ? 'danger' : undefined}\n />\n {touched.has('email') && errors.email && (\n <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>\n )}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Phone (optional)</Text>\n <TextInput\n value={data.phone}\n onChangeText={(v) => handleChange('phone', v)}\n onBlur={() => handleBlur('phone')}\n placeholder=\"+1 234 567 8900\"\n inputMode=\"number\"\n intent={touched.has('phone') && errors.phone ? 'danger' : undefined}\n />\n {touched.has('phone') && errors.phone && (\n <Text typography=\"body2\" color=\"danger\">{errors.phone}</Text>\n )}\n </View>\n\n <Select\n label=\"Country\"\n value={data.country}\n onChange={(v) => handleChange('country', v)}\n placeholder=\"Select a country\"\n options={[\n { label: 'United States', value: 'us' },\n { label: 'Canada', value: 'ca' },\n { label: 'United Kingdom', value: 'uk' },\n { label: 'Australia', value: 'au' },\n ]}\n error={touched.has('country') && !!errors.country}\n helperText={touched.has('country') ? errors.country : undefined}\n />\n\n <TextArea\n label=\"Message\"\n value={data.message}\n onChange={(v) => handleChange('message', v)}\n placeholder=\"Tell us what you need...\"\n rows={4}\n error={touched.has('message') ? errors.message : undefined}\n />\n\n <Button onPress={handleSubmit} loading={isSubmitting} disabled={isSubmitting}>\n Send Message\n </Button>\n </View>\n </Card>\n );\n}`,\n explanation: `Comprehensive form with:\n- Per-field validation with custom rules\n- Touched state tracking (only show errors after blur)\n- Real-time validation after first touch\n- Submit validation\n- Loading state during submission\n- Form reset after success`,\n tips: [\n \"Consider using react-hook-form for complex forms\",\n \"Add async validation for unique fields (email, username)\",\n \"Show success message after submission\",\n \"Persist form data for long forms\",\n ],\n relatedRecipes: [\"login-form\", \"signup-form\"],\n },\n};\n","/**\n * Media Recipes - Image upload, camera, and media handling\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const mediaRecipes: Record<string, Recipe> = {\n \"image-upload\": {\n name: \"Image Upload\",\n description: \"Image picker with preview and upload progress using @idealyst/files\",\n category: \"media\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/files\"],\n code: `import React from 'react';\nimport { View, Text, Button, Image, Pressable, Icon, Progress } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { useFilePicker, useFileUpload, FILE_PICKER_PRESETS } from '@idealyst/files';\n\nconst closeIcon: IconName = 'close';\nconst imagePlusIcon: IconName = 'image-plus';\n\nexport function ImageUpload({ uploadUrl }: { uploadUrl: string }) {\n const picker = useFilePicker({ config: FILE_PICKER_PRESETS.images });\n const uploader = useFileUpload({ autoStart: false, concurrency: 1 });\n\n const handlePickImages = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n // Images are now in picker.files\n }\n };\n\n const handleUpload = () => {\n if (picker.files.length === 0) return;\n uploader.addFiles(picker.files, {\n url: uploadUrl,\n method: 'POST',\n fieldName: 'file',\n multipart: true,\n concurrency: 1,\n timeout: 30000,\n retryEnabled: true,\n maxRetries: 3,\n retryDelay: 'exponential',\n retryDelayMs: 1000,\n chunkedUpload: false,\n chunkSize: 10 * 1024 * 1024,\n chunkedUploadThreshold: 50 * 1024 * 1024,\n backgroundUpload: false,\n });\n uploader.start();\n };\n\n return (\n <View gap=\"md\" padding=\"md\">\n {picker.files.length > 0 ? (\n <View style={{ alignItems: 'center' }} gap=\"md\">\n <View style={{ flexDirection: 'row', flexWrap: 'wrap' }} gap=\"sm\">\n {picker.files.map((file) => (\n <View key={file.id} style={{ position: 'relative' }}>\n <Image\n source={file.uri}\n width={120}\n height={120}\n objectFit=\"cover\"\n borderRadius={8}\n />\n <Pressable\n onPress={() => picker.clear()}\n style={{\n position: 'absolute',\n top: -8,\n right: -8,\n backgroundColor: '#ef4444',\n borderRadius: 12,\n padding: 4,\n }}\n >\n <Icon name={closeIcon} size=\"xs\" />\n </Pressable>\n </View>\n ))}\n </View>\n\n {uploader.uploads.map((upload) => (\n <View key={upload.id} gap=\"xs\" style={{ width: '100%' }}>\n <Text typography=\"caption\">{upload.file.name}</Text>\n <Progress value={upload.percentage} />\n <Text typography=\"caption\" color=\"secondary\">\n {upload.state} — {upload.percentage}%\n </Text>\n </View>\n ))}\n\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button\n onPress={() => picker.clear()}\n type=\"outlined\"\n intent=\"secondary\"\n >\n Clear\n </Button>\n <Button\n onPress={handleUpload}\n disabled={uploader.isUploading}\n loading={uploader.isUploading}\n leftIcon=\"upload\"\n >\n Upload\n </Button>\n </View>\n </View>\n ) : (\n <View gap=\"sm\">\n <Pressable\n onPress={handlePickImages}\n style={{\n borderWidth: 2,\n borderStyle: 'dashed',\n borderColor: '#ccc',\n borderRadius: 8,\n padding: 32,\n alignItems: 'center',\n }}\n >\n <Icon name={imagePlusIcon} size=\"lg\" />\n <Text typography=\"body2\" color=\"secondary\" style={{ marginTop: 8 }}>\n Tap to select images\n </Text>\n </Pressable>\n </View>\n )}\n </View>\n );\n}`,\n explanation: `Image upload with @idealyst/files:\n- useFilePicker with FILE_PICKER_PRESETS.images for image selection\n- useFileUpload for upload queue with progress tracking\n- Image previews using Image component with source prop\n- Icon uses size=\"xs\"/\"sm\"/\"md\"/\"lg\" — NOT numeric values\n- Pressable for interactive areas (NOT View with onPress)`,\n tips: [\n \"Use FILE_PICKER_PRESETS for common configs (images, documents, etc.)\",\n \"useFilePicker.pick() returns { cancelled, files, rejected }\",\n \"Image uses 'source' prop (string or { uri }) — NOT 'src'\",\n \"Image uses 'objectFit' — NOT 'contentFit'\",\n \"Icon size is always a Size string: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n ],\n relatedRecipes: [\"profile-screen\", \"form-with-validation\"],\n },\n};\n","/**\n * Idealyst Recipes - Common UI Patterns\n * Ready-to-use code examples for building apps with Idealyst\n *\n * Recipes are organized by category for maintainability.\n */\n\nexport { Recipe } from \"./types.js\";\nexport { authRecipes } from \"./auth.js\";\nexport { settingsRecipes } from \"./settings.js\";\nexport { navigationRecipes } from \"./navigation.js\";\nexport { dataRecipes } from \"./data.js\";\nexport { layoutRecipes } from \"./layout.js\";\nexport { formsRecipes } from \"./forms.js\";\nexport { mediaRecipes } from \"./media.js\";\n\nimport { Recipe } from \"./types.js\";\nimport { authRecipes } from \"./auth.js\";\nimport { settingsRecipes } from \"./settings.js\";\nimport { navigationRecipes } from \"./navigation.js\";\nimport { dataRecipes } from \"./data.js\";\nimport { layoutRecipes } from \"./layout.js\";\nimport { formsRecipes } from \"./forms.js\";\nimport { mediaRecipes } from \"./media.js\";\n\n/**\n * All recipes combined into a single record\n */\nexport const recipes: Record<string, Recipe> = {\n ...authRecipes,\n ...settingsRecipes,\n ...navigationRecipes,\n ...dataRecipes,\n ...layoutRecipes,\n ...formsRecipes,\n ...mediaRecipes,\n};\n\n/**\n * Get all recipes grouped by category\n */\nexport function getRecipesByCategory(): Record<string, Recipe[]> {\n const grouped: Record<string, Recipe[]> = {};\n\n for (const recipe of Object.values(recipes)) {\n if (!grouped[recipe.category]) {\n grouped[recipe.category] = [];\n }\n grouped[recipe.category].push(recipe);\n }\n\n return grouped;\n}\n\n/**\n * Get all recipes for a specific category\n */\nexport function getRecipesForCategory(category: string): Recipe[] {\n return Object.values(recipes).filter((r) => r.category === category);\n}\n\n/**\n * Keyword synonyms for recipe search.\n * When a user searches for a term on the left, also match terms on the right.\n */\nconst searchSynonyms: Record<string, string[]> = {\n profile: ['settings', 'account', 'user', 'avatar', 'edit'],\n account: ['profile', 'settings', 'user'],\n user: ['profile', 'account', 'avatar'],\n preferences: ['settings'],\n dark: ['theme', 'appearance'],\n light: ['theme', 'appearance'],\n appearance: ['theme'],\n register: ['signup', 'sign-up'],\n signin: ['login', 'sign-in'],\n 'sign-in': ['login'],\n 'sign-up': ['signup'],\n modal: ['overlay', 'dialog', 'sheet'],\n popup: ['modal', 'dialog', 'overlay'],\n table: ['datagrid', 'data', 'list'],\n grid: ['datagrid', 'data', 'list'],\n upload: ['file', 'image', 'media'],\n picker: ['file', 'image', 'select'],\n loading: ['skeleton'],\n spinner: ['loading', 'skeleton'],\n api: ['trpc', 'backend', 'router', 'server'],\n backend: ['trpc', 'api', 'router', 'server'],\n server: ['api', 'backend', 'trpc'],\n router: ['trpc', 'api'],\n database: ['prisma', 'trpc', 'data'],\n prisma: ['database', 'trpc'],\n crud: ['trpc', 'data', 'list'],\n todo: ['trpc', 'data'],\n};\n\n/**\n * Search recipes by query.\n * Matches against recipe ID (slug), name, description, packages, and category.\n * Also supports multi-word queries and synonym expansion.\n */\nexport function searchRecipes(query: string): Recipe[] {\n const lowerQuery = query.toLowerCase();\n const queryWords = lowerQuery.split(/\\s+/).filter(Boolean);\n\n // Expand query with synonyms\n const expandedWords = new Set(queryWords);\n for (const word of queryWords) {\n const syns = searchSynonyms[word];\n if (syns) {\n for (const syn of syns) expandedWords.add(syn);\n }\n }\n\n return Object.entries(recipes)\n .filter(([id, r]) => {\n const searchText = `${id} ${r.name} ${r.description} ${r.packages.join(' ')} ${r.category} ${(r.relatedRecipes || []).join(' ')}`.toLowerCase();\n\n // Exact substring match\n if (searchText.includes(lowerQuery)) return true;\n\n // All words match (supports \"navigation tabs\" matching \"tab-navigation\")\n if (queryWords.length > 1 && queryWords.every(w => searchText.includes(w))) return true;\n\n // Synonym-expanded match: any expanded word matches\n for (const word of expandedWords) {\n if (searchText.includes(word)) return true;\n }\n\n return false;\n })\n .map(([_, r]) => r);\n}\n\n/**\n * Get a summary list of all recipes\n */\nexport function getRecipeSummary(): Array<{\n id: string;\n name: string;\n description: string;\n category: string;\n difficulty: string;\n packages: string[];\n}> {\n return Object.entries(recipes).map(([id, recipe]) => ({\n id,\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n}\n","/**\n * Tool Definitions\n *\n * MCP tool schema definitions for all Idealyst tools.\n * These can be used to register tools with an MCP server or other systems.\n */\n\nimport type { ToolDefinition } from \"./types.js\";\n\n// ============================================================================\n// Component Tool Definitions\n// ============================================================================\n\nexport const listComponentsDefinition: ToolDefinition = {\n name: \"list_components\",\n description: \"List all available Idealyst components with brief descriptions\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport const getComponentDocsDefinition: ToolDefinition = {\n name: \"get_component_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst component including props, usage, and examples\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input')\",\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExampleDefinition: ToolDefinition = {\n name: \"get_component_example\",\n description: \"Get a code example for a specific Idealyst component\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component\",\n },\n example_type: {\n type: \"string\",\n description:\n \"Type of example: 'basic', 'variants', 'with-icons', 'interactive'\",\n enum: [\"basic\", \"variants\", \"with-icons\", \"interactive\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const searchComponentsDefinition: ToolDefinition = {\n name: \"search_components\",\n description: \"Search for components by name, category, or feature\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n category: {\n type: \"string\",\n description:\n \"Filter by category: 'layout', 'form', 'display', 'navigation', 'overlay', 'data'\",\n enum: [\"layout\", \"form\", \"display\", \"navigation\", \"overlay\", \"data\"],\n },\n },\n },\n};\n\nexport const getComponentTypesDefinition: ToolDefinition = {\n name: \"get_component_types\",\n description:\n \"Get TypeScript type definitions for a specific component directly from the source. Returns the actual TypeScript interface and/or JSON schema. Supports comma-separated names to batch multiple components in one call (e.g., 'Button,Card,Text').\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input'). Supports comma-separated names for batch lookup: 'Button,Card,Text,Icon'\",\n },\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript' for raw TypeScript definitions, 'json' for parsed schema, 'both' for combined output (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExamplesTsDefinition: ToolDefinition = {\n name: \"get_component_examples_ts\",\n description:\n \"Get validated TypeScript example code for a component. These examples are type-checked and guaranteed to compile.\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component (e.g., 'Button', 'Card')\",\n },\n },\n required: [\"component\"],\n },\n};\n\n// ============================================================================\n// CLI Tool Definitions\n// ============================================================================\n\nexport const getCliUsageDefinition: ToolDefinition = {\n name: \"get_cli_usage\",\n description: \"Get information about Idealyst CLI commands and usage\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"Specific CLI command to get info about (optional)\",\n },\n },\n },\n};\n\n// ============================================================================\n// Icon Tool Definitions\n// ============================================================================\n\nexport const searchIconsDefinition: ToolDefinition = {\n name: \"search_icons\",\n description:\n \"Search for Material Design Icons by name or keyword. Returns matching icon names from 7,447 available icons.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search term to find icons (e.g., 'home', 'user', 'arrow')\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of results to return (default: 20)\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Theme Tool Definitions\n// ============================================================================\n\nexport const getThemeTypesDefinition: ToolDefinition = {\n name: \"get_theme_types\",\n description:\n \"Get TypeScript type definitions for theme types (Size, Intent, Color, etc.) directly from @idealyst/theme\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Navigation Tool Definitions\n// ============================================================================\n\nexport const getNavigationTypesDefinition: ToolDefinition = {\n name: \"get_navigation_types\",\n description:\n \"Get TypeScript type definitions for navigation types directly from @idealyst/navigation\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Guide Tool Definitions\n// ============================================================================\n\nexport const getTranslateGuideDefinition: ToolDefinition = {\n name: \"get_translate_guide\",\n description:\n \"Get documentation for @idealyst/translate internationalization package. Covers runtime API, Babel plugin, translation files, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api' (or 'runtime-api'), 'babel-plugin', 'translation-files', 'examples'\",\n enum: [\n \"overview\",\n \"api\",\n \"runtime-api\",\n \"babel-plugin\",\n \"translation-files\",\n \"examples\",\n ],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getStorageGuideDefinition: ToolDefinition = {\n name: \"get_storage_guide\",\n description:\n \"Get documentation for @idealyst/storage cross-platform storage package. Covers API reference and usage examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getAudioGuideDefinition: ToolDefinition = {\n name: \"get_audio_guide\",\n description:\n \"Get documentation for @idealyst/audio PCM audio streaming package. Covers recorder, player, PCM data types, and examples. IMPORTANT: This is a PCM streaming library, NOT file-based recording.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getCameraGuideDefinition: ToolDefinition = {\n name: \"get_camera_guide\",\n description:\n \"Get documentation for @idealyst/camera photo and video capture package. Covers CameraPreview component, useCamera hook, permissions, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getFilesGuideDefinition: ToolDefinition = {\n name: \"get_files_guide\",\n description:\n \"Get documentation for @idealyst/files file picking and upload package. Covers useFilePicker, useFileUpload, DropZone, FilePickerButton, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getOauthClientGuideDefinition: ToolDefinition = {\n name: \"get_oauth_client_guide\",\n description:\n \"Get documentation for @idealyst/oauth-client OAuth2 authentication package. Covers createOAuthClient, configuration, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getAnimateGuideDefinition: ToolDefinition = {\n name: \"get_animate_guide\",\n description:\n \"Get documentation for @idealyst/animate cross-platform animation hooks. Covers useAnimatedStyle, useSequence, useKeyframes, usePresence, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getDatagridGuideDefinition: ToolDefinition = {\n name: \"get_datagrid_guide\",\n description:\n \"Get documentation for @idealyst/datagrid virtualized data grid package. Covers DataGrid component, Column configuration, sorting, selection, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getDatepickerGuideDefinition: ToolDefinition = {\n name: \"get_datepicker_guide\",\n description:\n \"Get documentation for @idealyst/datepicker date and time picker components. Covers DatePicker, TimePicker, DateInput, TimeInput, DateTimePicker, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getLottieGuideDefinition: ToolDefinition = {\n name: \"get_lottie_guide\",\n description:\n \"Get documentation for @idealyst/lottie Lottie animation component. Covers LottieProps, LottieRef imperative methods, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getMarkdownGuideDefinition: ToolDefinition = {\n name: \"get_markdown_guide\",\n description:\n \"Get documentation for @idealyst/markdown cross-platform Markdown renderer. Covers MarkdownProps, style overrides, link/image handling, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getConfigGuideDefinition: ToolDefinition = {\n name: \"get_config_guide\",\n description:\n \"Get documentation for @idealyst/config cross-platform environment variable management. Covers IConfig API, key naming, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getChartsGuideDefinition: ToolDefinition = {\n name: \"get_charts_guide\",\n description:\n \"Get documentation for @idealyst/charts animated charting library. Covers LineChart, BarChart, data types, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\n// ============================================================================\n// Package Tool Definitions\n// ============================================================================\n\nexport const listPackagesDefinition: ToolDefinition = {\n name: \"list_packages\",\n description:\n \"List all available Idealyst packages with descriptions, categories, and documentation status. Use this to discover what packages are available in the framework.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\"core\", \"ui\", \"media\", \"data\", \"auth\", \"utility\", \"tooling\"],\n },\n },\n },\n};\n\nexport const getPackageDocsDefinition: ToolDefinition = {\n name: \"get_package_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst package including installation, features, quick start, and API highlights.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'oauth-client', 'datagrid')\",\n },\n section: {\n type: \"string\",\n description:\n \"Specific section to retrieve (optional, returns all if not specified)\",\n enum: [\"overview\", \"installation\", \"features\", \"quickstart\", \"api\"],\n },\n },\n required: [\"package\"],\n },\n};\n\nexport const searchPackagesDefinition: ToolDefinition = {\n name: \"search_packages\",\n description:\n \"Search across all Idealyst packages by name, description, or features.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Recipe Tool Definitions\n// ============================================================================\n\nexport const listRecipesDefinition: ToolDefinition = {\n name: \"list_recipes\",\n description:\n \"List all available Idealyst recipes (common UI patterns) with descriptions. Recipes provide ready-to-use code examples for building apps.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\n \"forms\",\n \"navigation\",\n \"data\",\n \"layout\",\n \"auth\",\n \"settings\",\n \"media\",\n ],\n },\n difficulty: {\n type: \"string\",\n description: \"Filter by difficulty (optional)\",\n enum: [\"beginner\", \"intermediate\", \"advanced\"],\n },\n },\n },\n};\n\nexport const getRecipeDefinition: ToolDefinition = {\n name: \"get_recipe\",\n description:\n \"Get a complete code recipe for a common UI pattern. Returns ready-to-use code with explanation and tips.\",\n inputSchema: {\n type: \"object\",\n properties: {\n recipe: {\n type: \"string\",\n description:\n \"Recipe ID (e.g., 'login-form', 'settings-screen', 'tab-navigation')\",\n },\n },\n required: [\"recipe\"],\n },\n};\n\nexport const searchRecipesDefinition: ToolDefinition = {\n name: \"search_recipes\",\n description:\n \"Search for recipes by name, description, category, or required packages.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (e.g., 'auth', 'form', 'navigation')\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Install Guide Tool Definitions\n// ============================================================================\n\nexport const getInstallGuideDefinition: ToolDefinition = {\n name: \"get_install_guide\",\n description:\n \"Get detailed installation instructions for an Idealyst package, including iOS (Info.plist, CocoaPods), Android (AndroidManifest.xml, permissions, Gradle), and web configuration. Essential for packages with native dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'audio', 'oauth-client', 'storage')\",\n },\n },\n required: [\"package\"],\n },\n};\n\n// ============================================================================\n// Intro Tool Definitions\n// ============================================================================\n\nexport const getIntroDefinition: ToolDefinition = {\n name: \"get_intro\",\n description:\n \"Get a comprehensive introduction to the Idealyst framework. Returns an overview of the component paradigm, correct prop conventions, available packages, and common mistakes to avoid. **Call this first** before writing any Idealyst code.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\n// ============================================================================\n// All Tool Definitions Array\n// ============================================================================\n\n/**\n * Array of all tool definitions.\n * Use this to register all tools with an MCP server.\n */\nexport const toolDefinitions: ToolDefinition[] = [\n // Component tools\n listComponentsDefinition,\n getComponentDocsDefinition,\n getComponentExampleDefinition,\n searchComponentsDefinition,\n getComponentTypesDefinition,\n getComponentExamplesTsDefinition,\n // CLI tools\n getCliUsageDefinition,\n // Icon tools\n searchIconsDefinition,\n // Theme tools\n getThemeTypesDefinition,\n // Navigation tools\n getNavigationTypesDefinition,\n // Guide tools\n getTranslateGuideDefinition,\n getStorageGuideDefinition,\n getAudioGuideDefinition,\n getCameraGuideDefinition,\n getFilesGuideDefinition,\n getOauthClientGuideDefinition,\n getAnimateGuideDefinition,\n getDatagridGuideDefinition,\n getDatepickerGuideDefinition,\n getLottieGuideDefinition,\n getMarkdownGuideDefinition,\n getConfigGuideDefinition,\n getChartsGuideDefinition,\n // Package tools\n listPackagesDefinition,\n getPackageDocsDefinition,\n searchPackagesDefinition,\n // Recipe tools\n listRecipesDefinition,\n getRecipeDefinition,\n searchRecipesDefinition,\n // Install guide tools\n getInstallGuideDefinition,\n // Intro tool\n getIntroDefinition,\n];\n\n/**\n * Map of tool definitions by name.\n * Use this for quick lookup of a specific tool definition.\n */\nexport const toolDefinitionMap: Record<string, ToolDefinition> =\n Object.fromEntries(toolDefinitions.map((tool) => [tool.name, tool]));\n","/**\n * Component Metadata\n *\n * Minimal metadata for components that cannot be derived from TypeScript types\n * or example files. Types come from @idealyst/tooling, examples come from\n * the examples/components/*.examples.tsx files.\n */\n\nexport interface ComponentMetadata {\n /** Category for filtering/search */\n category: 'form' | 'feedback' | 'layout' | 'display' | 'navigation' | 'overlay' | 'data';\n /** Brief description of the component */\n description: string;\n /** Key features of the component */\n features: string[];\n /** Best practices for using the component */\n bestPractices: string[];\n}\n\nexport const componentMetadata: Record<string, ComponentMetadata> = {\n Accordion: {\n category: 'display',\n description: 'Expandable content sections that show/hide content on user interaction. Takes an `items` array of `AccordionItem` objects: `{ id: string; title: string; content: React.ReactNode; disabled?: boolean }`.',\n features: [\n 'Single or multiple expanded sections',\n 'Customizable icons',\n 'Disabled state support',\n 'Controlled and uncontrolled modes',\n 'items prop: AccordionItem[] — each item has { id: string, title: string, content: ReactNode, disabled?: boolean }',\n ],\n bestPractices: [\n 'Use for organizing related content into collapsible sections',\n 'Keep section titles concise and descriptive',\n 'Consider single-expand mode for sequential content',\n 'AccordionItem interface: { id: string; title: string; content: React.ReactNode; disabled?: boolean }',\n ],\n },\n\n ActivityIndicator: {\n category: 'feedback',\n description: 'Loading spinner (also known as loader or activity indicator) to indicate ongoing operations',\n features: [\n 'Multiple sizes',\n 'Intent colors',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use for short loading operations',\n 'For longer operations, consider Progress with determinate value',\n 'Place near the content being loaded',\n ],\n },\n\n Alert: {\n category: 'feedback',\n description: 'Message banner for displaying important information, warnings, errors, and success messages',\n features: [\n 'Five intent types with semantic meaning',\n 'Three visual variants (filled, outlined, soft)',\n 'Default icons for each intent',\n 'Custom icon support',\n 'Dismissible with close button',\n 'Action buttons support',\n ],\n bestPractices: [\n \"Use 'danger' intent for critical errors requiring immediate attention\",\n \"Use 'warning' intent for important but non-critical information\",\n \"Use 'success' intent for positive confirmations\",\n \"Use 'info' intent for general informational messages\",\n 'Keep alert messages concise and actionable',\n ],\n },\n\n Avatar: {\n category: 'display',\n description: 'User or entity representation with image, initials, or icon fallback',\n features: [\n 'Image, initials, or icon display',\n 'Multiple sizes (xs, sm, md, lg, xl)',\n 'Circle or square shapes',\n 'Automatic fallback to initials',\n 'Custom background colors',\n ],\n bestPractices: [\n 'Provide fallback initials for missing images',\n 'Use consistent sizes within lists',\n 'Consider accessibility with alt text',\n ],\n },\n\n Badge: {\n category: 'display',\n description: 'Small status indicator or count display',\n features: [\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Filled, outlined, and soft variants',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for status indicators or counts',\n 'Keep badge content minimal (numbers or short text)',\n 'Use semantic intent colors for meaning',\n ],\n },\n\n Breadcrumb: {\n category: 'navigation',\n description: 'Navigation trail showing the current page location within a hierarchy',\n features: [\n 'Customizable separators',\n 'Link and text items',\n 'Responsive truncation',\n ],\n bestPractices: [\n 'Use for deep navigation hierarchies',\n 'Keep breadcrumb labels short',\n 'Make all items except the last clickable',\n ],\n },\n\n Button: {\n category: 'form',\n description: 'Interactive button component with multiple variants, sizes, and icon support',\n features: [\n 'Three type variants: contained, outlined, text',\n 'Five intent colors: primary, neutral, success, danger, warning',\n 'Five sizes: xs, sm, md, lg, xl',\n 'Loading state with spinner',\n 'Gradient overlay effects',\n 'Left and right icon support',\n 'Disabled states',\n 'Cross-platform',\n ],\n bestPractices: [\n \"Use 'primary' intent for main actions\",\n \"Use 'contained' type for prominent actions\",\n 'Keep button labels concise and action-oriented',\n 'Use loading state for async operations',\n ],\n },\n\n Card: {\n category: 'layout',\n description: 'Container component for grouping related content with optional elevation and borders. Card does NOT have sub-components — there is no Card.Content, Card.Header, Card.Body, or Card.Footer. Just use children directly: <Card padding=\"md\"><Text>...</Text></Card>.',\n features: [\n 'Multiple type variants (outlined, elevated, filled)',\n 'Pressable when onPress is provided',\n 'Customizable border radius',\n 'Intent colors',\n 'NO compound sub-components — use children directly, NOT Card.Content/Card.Header',\n ],\n bestPractices: [\n 'Use for grouping related content',\n 'Keep card content focused on a single topic',\n \"Use 'elevated' type sparingly for emphasis\",\n 'Simply add onPress to make a card interactive',\n 'Do NOT use Card.Content, Card.Header, Card.Body, Card.Footer — they do not exist. Use <Card padding=\"md\"><View>...</View></Card> instead',\n ],\n },\n\n Checkbox: {\n category: 'form',\n description: 'Toggle control for binary choices with optional label',\n features: [\n 'Checked, unchecked, and indeterminate states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Error state with helper text',\n 'Custom children support',\n ],\n bestPractices: [\n 'Use for independent binary choices',\n 'Use RadioButton for mutually exclusive options',\n 'Provide clear, descriptive labels',\n ],\n },\n\n Chip: {\n category: 'display',\n description: 'Compact element for tags, filters, or selections',\n features: [\n 'Filled, outlined, and soft variants',\n 'Intent colors',\n 'Multiple sizes',\n 'Deletable with close icon',\n 'Selectable mode',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for tags, filters, or compact selections',\n 'Keep chip labels concise',\n 'Use consistent styling within groups',\n ],\n },\n\n Dialog: {\n category: 'overlay',\n description: 'Modal overlay for important content requiring user attention or interaction',\n features: [\n 'Multiple sizes (sm, md, lg, fullscreen)',\n 'Standard, alert, and confirmation types',\n 'Title and close button',\n 'Backdrop click to close',\n 'Animation types (slide, fade)',\n ],\n bestPractices: [\n 'Use sparingly for important interactions',\n 'Provide clear actions for dismissal',\n 'Keep dialog content focused',\n 'Use confirmation dialogs for destructive actions',\n ],\n },\n\n Divider: {\n category: 'layout',\n description: 'Visual separator for content sections',\n features: [\n 'Horizontal and vertical orientations',\n 'Solid, dashed, and dotted types',\n 'Multiple sizes (thickness)',\n 'Intent colors',\n 'Text/content dividers',\n 'Configurable spacing',\n ],\n bestPractices: [\n 'Use to separate distinct content sections',\n 'Avoid overuse - whitespace is often sufficient',\n 'Use text dividers for labeled sections',\n ],\n },\n\n Grid: {\n category: 'layout',\n description: 'Cross-platform responsive grid layout for arranging items in columns',\n features: [\n 'Responsive column count based on breakpoints',\n 'Theme-aware gap spacing',\n 'CSS Grid on web for optimal performance',\n 'Flexbox wrapping on native with percentage-based widths',\n 'Inherits container style props (padding, margin)',\n ],\n bestPractices: [\n 'Use responsive columns for adaptive layouts: { xs: 1, sm: 2, lg: 4 }',\n 'Prefer theme gap sizes over custom spacing for consistency',\n 'Each direct child becomes a grid cell - wrap complex content in View if needed',\n 'Use alongside Card or View children for content containers',\n ],\n },\n\n Icon: {\n category: 'display',\n description: 'Material Design icon component with extensive icon library',\n features: [\n '7,447+ Material Design icons',\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Accessibility support',\n ],\n bestPractices: [\n 'Use meaningful icons that match their purpose',\n 'Pair icons with text for clarity when needed',\n 'Maintain consistent icon sizing',\n ],\n },\n\n Image: {\n category: 'display',\n description: 'Cross-platform image component with loading and error states',\n features: [\n 'Multiple resize modes',\n 'Loading placeholder',\n 'Error fallback',\n 'Lazy loading',\n 'Border radius support',\n ],\n bestPractices: [\n 'Provide appropriate alt text',\n 'Use correct resize mode for layout',\n 'Consider placeholder for slow-loading images',\n ],\n },\n\n Link: {\n category: 'navigation',\n description: 'Navigation link component for routing and external URLs',\n features: [\n 'Internal and external link support',\n 'Intent colors',\n 'Underline variants',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for navigation, not actions (use Button for actions)',\n 'Make link text descriptive',\n 'Indicate external links when appropriate',\n ],\n },\n\n List: {\n category: 'data',\n description: 'Optimized list component for displaying scrollable data',\n features: [\n 'Virtualized rendering for performance',\n 'Pull-to-refresh',\n 'Infinite scroll',\n 'Section headers',\n 'Empty state support',\n ],\n bestPractices: [\n 'Use for displaying collections of similar items',\n 'Implement pull-to-refresh for refreshable content',\n 'Provide empty state feedback',\n ],\n },\n\n Menu: {\n category: 'overlay',\n description: 'Dropdown menu for displaying a list of actions or options',\n features: [\n 'Trigger-based display',\n 'Multiple placements',\n 'Icon and description support',\n 'Dividers between groups',\n 'Keyboard navigation',\n ],\n bestPractices: [\n 'Group related actions together',\n 'Use icons for quick recognition',\n 'Keep menu items to a reasonable number',\n ],\n },\n\n Popover: {\n category: 'overlay',\n description: 'Floating content container anchored to a trigger element',\n features: [\n 'Multiple placements',\n 'Customizable content',\n 'Controlled and uncontrolled modes',\n 'Click outside to close',\n ],\n bestPractices: [\n 'Use for supplementary content or controls',\n 'Keep popover content focused',\n 'Consider mobile touch interactions',\n ],\n },\n\n Pressable: {\n category: 'form',\n description: 'Low-level touchable component for custom interactive elements',\n features: [\n 'Press feedback',\n 'Long press support',\n 'Disabled state',\n 'Custom hit slop',\n ],\n bestPractices: [\n 'Use Button for standard button interactions',\n 'Use Pressable for custom interactive areas',\n 'Provide visual feedback on press',\n ],\n },\n\n Progress: {\n category: 'feedback',\n description: 'Visual indicator for task completion or loading progress',\n features: [\n 'Linear and circular variants',\n 'Determinate and indeterminate modes',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Rounded option',\n ],\n bestPractices: [\n 'Use determinate progress when percentage is known',\n 'Use indeterminate for unknown duration',\n 'Show percentage for long operations',\n ],\n },\n\n RadioButton: {\n category: 'form',\n description: 'Selection control for mutually exclusive options',\n features: [\n 'Single selection in a group',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for mutually exclusive options',\n 'Group related options together',\n 'Provide a default selection when appropriate',\n ],\n },\n\n Screen: {\n category: 'layout',\n description: 'Full-screen container component for app screens',\n features: [\n 'Safe area handling',\n 'Keyboard avoiding behavior',\n 'Status bar configuration',\n 'Background color support',\n ],\n bestPractices: [\n 'Use as the root container for screens',\n 'Enable keyboard avoiding for form screens',\n 'Configure safe areas appropriately',\n ],\n },\n\n Select: {\n category: 'form',\n description: 'Dropdown selection component for choosing from a list of options',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Searchable (web)',\n 'Label and helper text',\n 'Error state',\n 'Disabled options',\n ],\n bestPractices: [\n 'Use for selecting from many options',\n 'Use RadioButton for 2-5 visible options',\n 'Provide a clear placeholder',\n ],\n },\n\n Skeleton: {\n category: 'feedback',\n description: 'Placeholder loading state for content. Uses `shape` prop (NOT `variant`).',\n features: [\n 'shape prop: \\'rectangle\\' | \\'circle\\' | \\'rounded\\' (NOT variant)',\n 'animation prop: \\'pulse\\' | \\'wave\\' | \\'none\\'',\n 'Customizable width/height dimensions',\n 'Built-in pulse and shimmer animations (no manual Animated API needed)',\n ],\n bestPractices: [\n 'Match skeleton dimensions to actual content for seamless transition',\n 'Use shape=\\'circle\\' for avatar placeholders, \\'rounded\\' for cards',\n 'Use animation=\\'wave\\' for shimmer effect, \\'pulse\\' for fade',\n 'Import Skeleton from @idealyst/components (do NOT build custom with react-native Animated)',\n ],\n },\n\n Slider: {\n category: 'form',\n description: 'Range input control for selecting numeric values',\n features: [\n 'Min/max/step configuration',\n 'Value display',\n 'Min/max labels',\n 'Custom marks',\n 'Intent colors',\n 'Multiple sizes',\n ],\n bestPractices: [\n 'Use for selecting from a continuous range',\n 'Show current value for precision',\n 'Use marks for discrete steps',\n ],\n },\n\n SVGImage: {\n category: 'display',\n description: 'SVG image component for vector graphics',\n features: [\n 'URL and inline SVG support',\n 'Color tinting',\n 'Responsive sizing',\n ],\n bestPractices: [\n 'Use for scalable graphics',\n 'Provide fallback for missing SVGs',\n 'Consider Icon for simple icons',\n ],\n },\n\n Switch: {\n category: 'form',\n description: 'Toggle control for binary on/off states',\n features: [\n 'On/off states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Custom on/off icons',\n ],\n bestPractices: [\n 'Use for immediate effect toggles',\n 'Use Checkbox when submission is required',\n 'Provide clear labels indicating the on state',\n ],\n },\n\n TabBar: {\n category: 'navigation',\n description: 'Bottom navigation bar for main app sections',\n features: [\n 'Icon and label tabs',\n 'Badge indicators',\n 'Custom styling',\n ],\n bestPractices: [\n 'Limit to 3-5 main destinations',\n 'Use clear, recognizable icons',\n 'Show badges for notifications',\n ],\n },\n\n Table: {\n category: 'data',\n description: 'Structured data display in rows and columns',\n features: [\n 'Sortable columns',\n 'Custom cell rendering',\n 'Header and footer',\n 'Striped rows',\n ],\n bestPractices: [\n 'Use for structured, comparable data',\n 'Align numbers to the right',\n 'Provide sorting for large datasets',\n ],\n },\n\n Tabs: {\n category: 'navigation',\n description: 'Horizontal tab navigation for switching between content panels',\n features: [\n 'Controlled and uncontrolled modes',\n 'Icon and label tabs',\n 'Scrollable for many tabs',\n 'Badge support',\n ],\n bestPractices: [\n 'Use for content at the same hierarchy level',\n 'Keep tab labels short',\n 'Limit visible tabs to avoid scrolling',\n ],\n },\n\n Text: {\n category: 'display',\n description: 'Typography component for displaying text with consistent styling',\n features: [\n 'Typography presets: h1-h6, subtitle1-2, body1-2, button, caption, overline',\n 'Font weight control: light, normal, medium, semibold, bold',\n 'Theme text colors: primary, secondary, tertiary, inverse',\n 'Text alignment: left, center, right',\n 'Cross-platform text rendering',\n ],\n bestPractices: [\n 'Use the `typography` prop for text sizing (NOT `variant` or `size`)',\n 'Valid typography values: h1, h2, h3, h4, h5, h6, subtitle1, subtitle2, body1, body2, button, caption, overline',\n 'Use the `weight` prop for font weight (light, normal, medium, semibold, bold)',\n 'Use the `color` prop for theme text colors (primary, secondary, tertiary, inverse)',\n 'For custom colors beyond theme text colors, use the `style` prop: style={{ color: \"#hex\" }}',\n 'Text does NOT have `variant`, `intent`, or `size` props — use `typography`, `weight`, `color`, and `style` instead',\n ],\n },\n\n TextArea: {\n category: 'form',\n description: 'Multi-line text input for longer content',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Character count',\n 'Auto-resize',\n 'Error state',\n ],\n bestPractices: [\n 'Use for multi-line input',\n 'Show character limits when applicable',\n 'Provide appropriate placeholder text',\n ],\n },\n\n TextInput: {\n category: 'form',\n description: 'Single-line text input field with various configurations',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Left and right icons',\n 'Password visibility toggle',\n \"Input modes: 'text' | 'email' | 'password' | 'number' (these 4 ONLY, NOT 'decimal' or 'tel')\",\n 'Error state with helper text',\n ],\n bestPractices: [\n 'Use appropriate input mode for content type',\n 'Provide clear labels and placeholders',\n 'Show validation errors inline',\n ],\n },\n\n Tooltip: {\n category: 'overlay',\n description: 'Contextual information popup on hover or focus',\n features: [\n 'Multiple placements',\n 'Customizable delay',\n 'Arrow indicator',\n 'Custom content support',\n ],\n bestPractices: [\n 'Use for supplementary information',\n 'Keep tooltip content brief',\n 'Ensure touch-friendly alternatives for mobile',\n ],\n },\n\n Video: {\n category: 'display',\n description: 'Video player component with playback controls',\n features: [\n 'Multiple source support',\n 'Playback controls',\n 'Poster image',\n 'Loop and autoplay',\n ],\n bestPractices: [\n 'Provide poster images for preview',\n 'Consider autoplay carefully (user experience)',\n 'Support multiple formats for compatibility',\n ],\n },\n\n View: {\n category: 'layout',\n description: 'Fundamental layout container with spacing and flex support',\n features: [\n 'Spacing presets',\n 'Flex layout shortcuts',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use spacing prop for consistent gaps',\n 'Prefer View over native div/View for consistency',\n 'Use for layout structure, not styling',\n ],\n },\n};\n\n/**\n * Aliases for deprecated or commonly confused component names.\n * Maps lowercase alias → canonical component name.\n */\nconst componentAliases: Record<string, string> = {\n input: \"TextInput\",\n spinner: \"ActivityIndicator\",\n loader: \"ActivityIndicator\",\n loading: \"ActivityIndicator\",\n toggle: \"Switch\",\n dropdown: \"Select\",\n touchable: \"Pressable\",\n touchableopacity: \"Pressable\",\n fab: \"IconButton\",\n modal: \"Dialog\",\n tooltip: \"Tooltip\",\n snackbar: \"Toast\",\n};\n\n/**\n * Find the canonical component name (case-insensitive lookup with alias support)\n */\nexport function findComponentName(componentName: string): string | undefined {\n // Direct match first (fast path)\n if (componentMetadata[componentName]) {\n return componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n const directMatch = Object.keys(componentMetadata).find(\n (name) => name.toLowerCase() === lowerName\n );\n if (directMatch) return directMatch;\n\n // Alias lookup (e.g. \"Input\" → \"TextInput\")\n return componentAliases[lowerName];\n}\n\n/**\n * Get metadata for a specific component (case-insensitive)\n */\nexport function getComponentMetadata(componentName: string): ComponentMetadata | undefined {\n const canonicalName = findComponentName(componentName);\n return canonicalName ? componentMetadata[canonicalName] : undefined;\n}\n\n/**\n * Get all component names\n */\nexport function getComponentNames(): string[] {\n return Object.keys(componentMetadata);\n}\n\n/**\n * Search components by name, description, or features\n */\nexport function searchComponents(query: string, category?: string): string[] {\n const lowerQuery = query.toLowerCase();\n const queryWords = lowerQuery.split(/\\s+/).filter(Boolean);\n\n // Check aliases first — if the query is a known alias, include that component\n const aliasMatch = componentAliases[lowerQuery];\n\n return Object.entries(componentMetadata)\n .filter(([name, meta]) => {\n if (category && meta.category !== category) {\n return false;\n }\n\n // Direct alias match\n if (aliasMatch && name === aliasMatch) return true;\n\n const searchText = `${name} ${meta.description} ${meta.features.join(' ')}`.toLowerCase();\n\n // Exact substring match\n if (searchText.includes(lowerQuery)) return true;\n\n // All words match (supports multi-word queries like \"spinner loading\")\n if (queryWords.length > 1 && queryWords.every(w => searchText.includes(w))) return true;\n\n return false;\n })\n .map(([name]) => name);\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(category: string): string[] {\n return Object.entries(componentMetadata)\n .filter(([_, meta]) => meta.category === category)\n .map(([name]) => name);\n}\n","export const cliCommands: Record<string, any> = {\n init: {\n description: \"Initialize a new Idealyst workspace with monorepo structure\",\n usage: \"idealyst init <workspace-name> [options]\",\n options: [\n {\n flag: \"workspace-name\",\n description: \"Name for the new workspace (required)\",\n },\n {\n flag: \"--git\",\n description: \"Initialize git repository (default: true)\",\n },\n {\n flag: \"--install\",\n description: \"Install dependencies after creation (default: true)\",\n },\n ],\n examples: [\n \"idealyst init my-app\",\n \"idealyst init my-company-workspace --no-git\",\n ],\n },\n\n create: {\n description: \"Create a new package within the Idealyst workspace\",\n usage: \"idealyst create <name> --type <type> [options]\",\n options: [\n {\n flag: \"name\",\n description: \"Name for the new package (required)\",\n },\n {\n flag: \"--type\",\n description: \"Package type: web | native | api | database | shared (required)\",\n },\n {\n flag: \"--app-name\",\n description: \"Display name for native app (required for native type)\",\n },\n {\n flag: \"--with-trpc\",\n description: \"Include tRPC setup (for web/native)\",\n },\n {\n flag: \"--no-trpc\",\n description: \"Exclude tRPC setup (for web/native)\",\n },\n ],\n examples: [\n \"idealyst create web --type web --with-trpc\",\n \"idealyst create mobile --type native --app-name \\\"My App\\\" --with-trpc\",\n \"idealyst create api --type api\",\n \"idealyst create database --type database\",\n \"idealyst create shared --type shared\",\n ],\n },\n\n dev: {\n description: \"Start development server for a package\",\n usage: \"cd packages/<name> && yarn dev\",\n options: [\n {\n flag: \"--port\",\n description: \"Port number for dev server (web only)\",\n },\n ],\n examples: [\n \"cd packages/web && yarn dev\",\n \"cd packages/native && yarn dev\",\n ],\n },\n\n build: {\n description: \"Build a package for production\",\n usage: \"cd packages/<name> && yarn build\",\n options: [],\n examples: [\n \"cd packages/web && yarn build\",\n \"cd packages/api && yarn build\",\n ],\n },\n\n test: {\n description: \"Run tests for packages\",\n usage: \"yarn test [options]\",\n options: [\n {\n flag: \"--watch\",\n description: \"Run tests in watch mode\",\n },\n {\n flag: \"--coverage\",\n description: \"Generate coverage report\",\n },\n ],\n examples: [\n \"yarn test\",\n \"yarn test:watch\",\n \"yarn test:coverage\",\n ],\n },\n};\n","/**\n * Audio Package Guides\n *\n * Comprehensive documentation for @idealyst/audio.\n * PCM audio streaming & playback — NOT file-based recording.\n */\n\nexport const audioGuides: Record<string, string> = {\n \"idealyst://audio/overview\": `# @idealyst/audio\n\nCross-platform **PCM audio streaming** package for React and React Native.\n\n> **Important:** This package provides real-time PCM streaming — it does NOT record to files.\n> \\`recorder.stop()\\` returns \\`void\\`. Audio data arrives via \\`subscribeToData()\\` callbacks as binary PCM chunks.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/audio\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ WebAudio API |\n| iOS | ✅ AVAudioEngine |\n| Android | ✅ AudioRecord |\n\n## Key Concepts\n\n1. **PCM Streaming** — Audio data is delivered as \\`PCMData\\` chunks via callbacks, not as files\n2. **Audio Session** — On iOS/Android, configure the audio session category before recording/playback\n3. **Audio Profiles** — Pre-configured \\`AudioConfig\\` presets: \\`speech\\`, \\`highQuality\\`, \\`studio\\`, \\`phone\\`\n4. **Session Presets** — Pre-configured \\`AudioSessionConfig\\` presets: \\`playback\\`, \\`record\\`, \\`voiceChat\\`, \\`ambient\\`, \\`default\\`\n\n## Exports\n\n\\`\\`\\`typescript\nimport {\n useRecorder,\n usePlayer,\n useAudio,\n AUDIO_PROFILES,\n SESSION_PRESETS,\n} from '@idealyst/audio';\nimport type { PCMData, AudioConfig, AudioLevel } from '@idealyst/audio';\n\\`\\`\\`\n`,\n\n \"idealyst://audio/api\": `# @idealyst/audio — API Reference\n\n## Hooks\n\n### useRecorder(options?)\n\nPCM streaming recorder hook.\n\n\\`\\`\\`typescript\ninterface UseRecorderOptions {\n config?: Partial<AudioConfig>; // Audio config (sample rate, channels, bit depth)\n autoRequestPermission?: boolean; // Auto-request mic permission on mount\n levelUpdateInterval?: number; // Level update interval in ms (default: 100)\n}\n\\`\\`\\`\n\n**Returns \\`UseRecorderResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | RecorderStatus | Full status object |\n| isRecording | boolean | Whether recording is active |\n| isPaused | boolean | Whether recording is paused |\n| permission | PermissionStatus | \\`'undetermined' \\\\| 'granted' \\\\| 'denied' \\\\| 'blocked'\\` |\n| duration | number | Recording duration in ms |\n| level | AudioLevel | Current audio level (\\`{ current, peak, rms, db }\\`) |\n| error | AudioError \\\\| null | Current error |\n| start | (config?) => Promise<void> | Start recording |\n| stop | () => Promise<void> | **Stop recording — returns void, NOT audio data** |\n| pause | () => Promise<void> | Pause recording |\n| resume | () => Promise<void> | Resume recording |\n| checkPermission | () => Promise<PermissionStatus> | Check mic permission |\n| requestPermission | () => Promise<PermissionStatus> | Request mic permission |\n| subscribeToData | (cb: RecorderDataCallback) => () => void | **Subscribe to PCM data chunks** |\n| resetPeakLevel | () => void | Reset peak level meter |\n\n> **Critical:** \\`stop()\\` returns \\`Promise<void>\\` — it does NOT return recorded audio.\n> You MUST use \\`subscribeToData()\\` to collect PCM data chunks during recording.\n\n---\n\n### usePlayer(options?)\n\nAudio playback hook supporting both file playback and PCM streaming.\n\n\\`\\`\\`typescript\ninterface UsePlayerOptions {\n autoPlay?: boolean; // Auto-play when source loaded\n volume?: number; // Initial volume (0.0 - 1.0)\n positionUpdateInterval?: number; // Position update interval in ms (default: 100)\n}\n\\`\\`\\`\n\n**Returns \\`UsePlayerResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | PlayerStatus | Full status object |\n| isPlaying | boolean | Whether playback is active |\n| isPaused | boolean | Whether playback is paused |\n| isLoading | boolean | Whether source is loading |\n| position | number | Current position in ms |\n| duration | number | Total duration in ms |\n| volume | number | Current volume (0.0 - 1.0) |\n| error | AudioError \\\\| null | Current error |\n| loadFile | (uri: string) => Promise<void> | Load audio file for playback |\n| unload | () => void | Unload current source |\n| loadPCMStream | (config: AudioConfig) => Promise<void> | **Start PCM streaming playback** |\n| feedPCMData | (data: ArrayBufferLike \\\\| Int16Array) => void | **Feed PCM data — NOT strings** |\n| flush | () => Promise<void> | Flush remaining buffered data |\n| clearBuffer | () => void | Clear playback buffer |\n| play | () => Promise<void> | Start/resume playback |\n| pause | () => void | Pause playback |\n| stop | () => void | Stop playback |\n| seek | (positionMs: number) => Promise<void> | Seek to position |\n| setVolume | (volume: number) => void | Set volume |\n| toggleMute | () => void | Toggle mute |\n\n> **Critical:** \\`feedPCMData()\\` accepts \\`ArrayBufferLike | Int16Array\\` — **NOT strings or base64**.\n\n---\n\n### useAudio(options?)\n\nAudio session management hook (primarily for iOS/Android).\n\n\\`\\`\\`typescript\ninterface UseAudioOptions {\n session?: Partial<AudioSessionConfig>; // Session config\n initializeOnMount?: boolean; // Initialize on mount (default: true)\n}\n\\`\\`\\`\n\n**Returns \\`UseAudioResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| isInitialized | boolean | Whether audio context is ready |\n| sessionState | AudioSessionState | Current session state |\n| outputs | string[] | Current audio outputs |\n| initialize | () => Promise<void> | Initialize audio context |\n| configureSession | (config) => Promise<void> | Configure audio session |\n| suspend | () => Promise<void> | Suspend audio context |\n| resume | () => Promise<void> | Resume audio context |\n\n---\n\n## Types\n\n### AudioConfig\n\n\\`\\`\\`typescript\ntype SampleRate = 8000 | 16000 | 22050 | 24000 | 44100 | 48000;\ntype BitDepth = 8 | 16 | 32;\ntype ChannelCount = 1 | 2;\n\ninterface AudioConfig {\n sampleRate: SampleRate; // Default: 16000\n channels: ChannelCount; // Default: 1 (mono)\n bitDepth: BitDepth; // Default: 16\n}\n\\`\\`\\`\n\n### PCMData\n\n\\`\\`\\`typescript\ninterface PCMData {\n buffer: ArrayBufferLike; // Raw audio buffer\n samples: Int8Array | Int16Array | Float32Array; // Typed sample array\n timestamp: number; // Capture timestamp\n config: AudioConfig; // Audio config used\n toBase64(): string; // For external APIs (e.g., speech-to-text HTTP). Do NOT pass to feedPCMData().\n}\n\\`\\`\\`\n\n### AudioLevel\n\n\\`\\`\\`typescript\ninterface AudioLevel {\n current: number; // 0.0 - 1.0\n peak: number; // 0.0 - 1.0\n rms: number; // Root mean square\n db: number; // Decibel value (-Infinity to 0)\n}\n\\`\\`\\`\n\n### AudioSessionConfig (iOS/Android)\n\n\\`\\`\\`typescript\ntype AudioSessionCategory = 'ambient' | 'soloAmbient' | 'playback' | 'record' | 'playAndRecord' | 'multiRoute';\ntype AudioSessionMode = 'default' | 'voiceChat' | 'gameChat' | 'videoRecording' | 'measurement' | 'moviePlayback' | 'videoChat' | 'spokenAudio';\n\ninterface AudioSessionConfig {\n category: AudioSessionCategory;\n categoryOptions?: AudioSessionCategoryOption[];\n mode?: AudioSessionMode;\n active?: boolean;\n}\n\\`\\`\\`\n\n### Error Types\n\n\\`\\`\\`typescript\ntype AudioErrorCode =\n | 'PERMISSION_DENIED' | 'PERMISSION_BLOCKED'\n | 'DEVICE_NOT_FOUND' | 'DEVICE_IN_USE' | 'NOT_SUPPORTED'\n | 'SOURCE_NOT_FOUND' | 'FORMAT_NOT_SUPPORTED' | 'DECODE_ERROR' | 'PLAYBACK_ERROR' | 'BUFFER_UNDERRUN'\n | 'RECORDING_ERROR'\n | 'INITIALIZATION_FAILED' | 'INVALID_STATE' | 'INVALID_CONFIG' | 'UNKNOWN';\n\ninterface AudioError {\n code: AudioErrorCode;\n message: string;\n originalError?: Error;\n}\n\\`\\`\\`\n\n---\n\n## Presets\n\n### AUDIO_PROFILES\n\n\\`\\`\\`typescript\nconst AUDIO_PROFILES: AudioProfiles = {\n speech: { sampleRate: 16000, channels: 1, bitDepth: 16 },\n highQuality: { sampleRate: 44100, channels: 2, bitDepth: 16 },\n studio: { sampleRate: 48000, channels: 2, bitDepth: 32 },\n phone: { sampleRate: 8000, channels: 1, bitDepth: 16 },\n};\n\\`\\`\\`\n\n### SESSION_PRESETS\n\n\\`\\`\\`typescript\nconst SESSION_PRESETS: SessionPresets = {\n playback: { category: 'playback', mode: 'default' },\n record: { category: 'record', mode: 'default' },\n voiceChat: { category: 'playAndRecord', mode: 'voiceChat', categoryOptions: ['allowBluetooth', 'defaultToSpeaker'] },\n ambient: { category: 'ambient', mode: 'default' },\n default: { category: 'soloAmbient', mode: 'default' },\n};\n\\`\\`\\`\n`,\n\n \"idealyst://audio/examples\": `# @idealyst/audio — Examples\n\n## Basic Recording with Data Collection\n\n\\`\\`\\`tsx\nimport React, { useRef, useEffect } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useRecorder, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction VoiceRecorder() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n // Subscribe to PCM data\n useEffect(() => {\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleToggle = async () => {\n if (recorder.isRecording) {\n await recorder.stop(); // Returns void — data already collected via subscribeToData\n console.log(\\`Collected \\${chunksRef.current.length} chunks\\`);\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button\n onPress={handleToggle}\n intent={recorder.isRecording ? 'error' : 'primary'}\n >\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Text>Duration: {Math.round(recorder.duration / 1000)}s</Text>\n <Text>Level: {Math.round(recorder.level.current * 100)}%</Text>\n </View>\n );\n}\n\\`\\`\\`\n\n## PCM Streaming Playback\n\n\\`\\`\\`tsx\nimport React, { useRef, useEffect } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useRecorder, usePlayer, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction RecordAndPlayback() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const player = usePlayer();\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n useEffect(() => {\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleRecord = async () => {\n if (recorder.isRecording) {\n await recorder.stop();\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n const handlePlayback = async () => {\n // Initialize PCM streaming playback with the same config\n await player.loadPCMStream(AUDIO_PROFILES.speech);\n await player.play();\n\n // Feed all collected chunks\n for (const chunk of chunksRef.current) {\n player.feedPCMData(chunk); // Accepts ArrayBufferLike — NOT strings\n }\n\n await player.flush(); // Flush remaining buffer\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handleRecord} intent={recorder.isRecording ? 'error' : 'primary'}>\n {recorder.isRecording ? 'Stop Recording' : 'Record'}\n </Button>\n <Button\n onPress={handlePlayback}\n intent=\"secondary\"\n disabled={chunksRef.current.length === 0 || player.isPlaying}\n >\n Play Back\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## File Playback\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Progress } from '@idealyst/components';\nimport { usePlayer } from '@idealyst/audio';\n\nfunction AudioFilePlayer({ uri }: { uri: string }) {\n const player = usePlayer();\n\n const handleLoad = async () => {\n await player.loadFile(uri);\n await player.play();\n };\n\n const progress = player.duration > 0 ? player.position / player.duration : 0;\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handleLoad} disabled={player.isPlaying}>\n Play File\n </Button>\n <Progress value={progress * 100} />\n <Text>\n {Math.round(player.position / 1000)}s / {Math.round(player.duration / 1000)}s\n </Text>\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => player.pause()} disabled={!player.isPlaying} size=\"sm\">\n Pause\n </Button>\n <Button onPress={() => player.stop()} size=\"sm\">\n Stop\n </Button>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Audio Session Setup (iOS/Android)\n\n\\`\\`\\`tsx\nimport React, { useEffect } from 'react';\nimport { useAudio, useRecorder, SESSION_PRESETS, AUDIO_PROFILES } from '@idealyst/audio';\n\nfunction VoiceChatScreen() {\n const audio = useAudio({ session: SESSION_PRESETS.voiceChat });\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n\n useEffect(() => {\n // Audio session is automatically configured on mount\n // For manual configuration:\n audio.configureSession({\n category: 'playAndRecord',\n mode: 'voiceChat',\n categoryOptions: ['allowBluetooth', 'defaultToSpeaker'],\n });\n }, []);\n\n // ... recording/playback logic\n}\n\\`\\`\\`\n\n## Audio Level Visualization\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { useRecorder, AUDIO_PROFILES } from '@idealyst/audio';\n\nfunction AudioLevelMeter() {\n const recorder = useRecorder({\n config: AUDIO_PROFILES.speech,\n autoRequestPermission: true,\n });\n\n return (\n <View padding=\"md\" gap=\"sm\">\n <Text>Level: {Math.round(recorder.level.current * 100)}%</Text>\n <Text>Peak: {Math.round(recorder.level.peak * 100)}%</Text>\n <Text>dB: {recorder.level.db.toFixed(1)}</Text>\n <View\n style={{\n height: 20,\n backgroundColor: '#e0e0e0',\n borderRadius: 10,\n overflow: 'hidden',\n }}\n >\n <View\n style={{\n width: \\`\\${recorder.level.current * 100}%\\`,\n height: '100%',\n backgroundColor: recorder.level.current > 0.8 ? 'red' : 'green',\n }}\n />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Camera Package Guides\n *\n * Comprehensive documentation for @idealyst/camera.\n */\n\nexport const cameraGuides: Record<string, string> = {\n \"idealyst://camera/overview\": `# @idealyst/camera\n\nCross-platform camera package for photo capture and video recording.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/camera\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ MediaDevices API |\n| iOS | ✅ AVFoundation |\n| Android | ✅ CameraX |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n CameraPreview, // Component — NOT \"Camera\"\n useCamera, // Hook — returns camera controls + cameraRef\n requestPermission, // Standalone function — NOT \"useCameraPermission\" or \"requestCameraPermission\"\n} from '@idealyst/camera';\n\\`\\`\\`\n\n> **Common mistakes:**\n> - The component is \\`CameraPreview\\`, NOT \\`Camera\\`\n> - Permission is requested via \\`requestPermission()\\` standalone function, NOT a hook or \\`requestCameraPermission\\`\n> - Pass \\`camera.cameraRef.current\\` to \\`CameraPreview\\`'s \\`camera\\` prop\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { View, Button } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\n\nfunction CameraScreen() {\n const camera = useCamera({ autoRequestPermission: true });\n\n const handleTakePhoto = async () => {\n const photo = await camera.takePhoto();\n console.log('Photo:', photo.uri, photo.width, photo.height);\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <Button onPress={handleTakePhoto} intent=\"primary\">Take Photo</Button>\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://camera/api\": `# @idealyst/camera — API Reference\n\n## Components\n\n### CameraPreview\n\nRenders the camera preview. Must receive a camera instance from \\`useCamera().cameraRef.current\\`.\n\n\\`\\`\\`typescript\ninterface CameraPreviewProps {\n camera: ICamera | null; // Camera instance from useCamera().cameraRef.current\n style?: StyleProp<ViewStyle>; // Preview container style\n aspectRatio?: number; // e.g., 16/9, 4/3 (default: auto)\n resizeMode?: 'cover' | 'contain'; // Default: 'cover'\n mirror?: boolean; // Mirror preview (default: auto based on position)\n enableTapToFocus?: boolean; // Default: true\n enablePinchToZoom?: boolean; // Default: true\n onReady?: () => void; // Called when preview is ready\n onFocus?: (point: FocusPoint) => void; // Called on tap-to-focus\n testID?: string;\n}\n\\`\\`\\`\n\n---\n\n## Hooks\n\n### useCamera(options?)\n\nMain camera hook. Returns camera state, controls, and a ref for CameraPreview.\n\n\\`\\`\\`typescript\ninterface UseCameraOptions {\n config?: Partial<CameraConfig>; // Initial camera configuration\n autoRequestPermission?: boolean; // Auto-request permission on mount (default: false)\n autoStart?: boolean; // Auto-start camera on mount (default: false)\n}\n\\`\\`\\`\n\n**Returns \\`UseCameraResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | CameraStatus | Full camera status |\n| isActive | boolean | Whether preview is active |\n| isRecording | boolean | Whether video recording is active |\n| recordingDuration | number | Video recording duration in ms |\n| activeDevice | CameraDevice \\\\| null | Currently active camera device |\n| availableDevices | CameraDevice[] | All available camera devices |\n| permission | PermissionResult \\\\| null | Permission status |\n| error | CameraError \\\\| null | Current error |\n| zoom | number | Current zoom level |\n| torchActive | boolean | Whether torch/flash is on |\n| start | (config?) => Promise<void> | Start camera preview |\n| stop | () => Promise<void> | Stop camera |\n| switchDevice | (deviceOrPosition) => Promise<void> | Switch camera (e.g., 'front' \\\\| 'back') |\n| takePhoto | (options?) => Promise<PhotoResult> | Take a photo |\n| startRecording | (options?) => Promise<void> | Start video recording |\n| stopRecording | () => Promise<VideoResult> | Stop video recording |\n| cancelRecording | () => Promise<void> | Cancel video recording |\n| setZoom | (level: number) => void | Set zoom level |\n| setTorch | (enabled: boolean) => void | Toggle torch/flash |\n| focusOnPoint | (x, y) => Promise<void> | Focus on point (0-1 normalized) |\n| requestPermission | () => Promise<PermissionResult> | Request camera permissions |\n| cameraRef | RefObject<ICamera \\\\| null> | **Ref to pass to CameraPreview** |\n\n---\n\n## Standalone Functions\n\n### requestPermission()\n\nRequest camera and microphone permissions. Returns a \\`PermissionResult\\`.\n\n> **Important:** The export is \\`requestPermission\\`, NOT \\`requestCameraPermission\\`.\n\n\\`\\`\\`typescript\nimport { requestPermission } from '@idealyst/camera';\n\nconst result = await requestPermission();\n// result: { camera: PermissionStatus, microphone: PermissionStatus, canAskAgain: boolean }\n\\`\\`\\`\n\n### checkPermission()\n\nCheck current permission status without prompting the user.\n\n\\`\\`\\`typescript\nimport { checkPermission } from '@idealyst/camera';\n\nconst result = await checkPermission();\nif (result.camera === 'granted') { /* ready */ }\n\\`\\`\\`\n\n---\n\n## Types\n\n### CameraStatus (interface, NOT an enum)\n\n\\`CameraStatus\\` is an **interface**, not an enum or string. Do NOT compare it directly to strings.\n\n\\`\\`\\`typescript\ninterface CameraStatus {\n state: CameraState; // Current camera state\n permission: PermissionStatus; // Current permission status\n isActive: boolean; // Whether preview is active\n isRecording: boolean; // Whether recording is in progress\n activeDevice: CameraDevice | null;\n error: CameraError | null;\n}\n\n// CameraState is a string union:\ntype CameraState = 'idle' | 'initializing' | 'ready' | 'recording' | 'capturing';\n\n// Check state like this:\nif (camera.status.state === 'ready') { /* ... */ }\nif (camera.status.permission === 'granted') { /* ... */ }\n\n// WRONG — do NOT compare CameraStatus directly to strings:\n// ❌ if (camera.status === 'not-determined')\n// ❌ if (camera.status === 'denied')\n\\`\\`\\`\n\n### PhotoResult\n\n\\`\\`\\`typescript\ninterface PhotoResult {\n uri: string; // File path (native) or Blob URL (web)\n width: number; // Image width in pixels\n height: number; // Image height in pixels\n size: number; // File size in bytes\n format: PhotoFormat; // 'jpeg' | 'png' | 'heic'\n metadata?: PhotoMetadata;\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n### VideoResult\n\n\\`\\`\\`typescript\ninterface VideoResult {\n uri: string; // File path or Blob URL\n duration: number; // Duration in ms\n width: number; // Video width in pixels\n height: number; // Video height in pixels\n size: number; // File size in bytes\n format: VideoFormat; // 'mp4' | 'mov'\n hasAudio: boolean;\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n### PhotoOptions\n\n\\`\\`\\`typescript\ninterface PhotoOptions {\n format?: PhotoFormat; // 'jpeg' | 'png' | 'heic' (default: 'jpeg')\n quality?: number; // 0-100 (default: 90)\n flash?: boolean; // Enable flash (default: false)\n skipSound?: boolean; // Skip shutter sound (native, default: false)\n}\n\\`\\`\\`\n\n### VideoOptions\n\n\\`\\`\\`typescript\ninterface VideoOptions {\n format?: VideoFormat; // 'mp4' | 'mov' (default: 'mp4')\n maxDuration?: number; // Max duration in seconds (0 = unlimited)\n audio?: boolean; // Enable audio (default: true)\n torch?: boolean; // Enable torch during recording (default: false)\n}\n\\`\\`\\`\n\n### CameraConfig\n\n\\`\\`\\`typescript\ntype CameraPosition = 'front' | 'back' | 'external';\ntype VideoQuality = 'low' | 'medium' | 'high' | '4k';\ntype PhotoQuality = 'low' | 'medium' | 'high' | 'maximum';\n\ninterface CameraConfig {\n position: CameraPosition; // Default: 'back'\n videoQuality: VideoQuality; // Default: 'high'\n photoQuality: PhotoQuality; // Default: 'high'\n resolution?: Resolution; // Target resolution (best effort)\n enableAudio: boolean; // Default: true\n torch: boolean; // Default: false\n zoom: number; // Default: 1.0\n autoFocus: boolean; // Default: true\n mirrorPreview?: boolean; // Default: auto based on position\n}\n\\`\\`\\`\n\n### PermissionResult\n\n\\`\\`\\`typescript\ntype PermissionStatus = 'granted' | 'denied' | 'undetermined' | 'blocked' | 'unavailable';\n\ninterface PermissionResult {\n camera: PermissionStatus;\n microphone: PermissionStatus;\n canAskAgain: boolean;\n}\n\\`\\`\\`\n\n### CameraError\n\n\\`\\`\\`typescript\ntype CameraErrorCode =\n | 'PERMISSION_DENIED' | 'PERMISSION_BLOCKED'\n | 'DEVICE_NOT_FOUND' | 'DEVICE_IN_USE' | 'NOT_SUPPORTED'\n | 'INITIALIZATION_FAILED' | 'CAPTURE_FAILED' | 'RECORDING_FAILED'\n | 'INVALID_CONFIG' | 'STORAGE_FULL' | 'UNKNOWN';\n\ninterface CameraError {\n code: CameraErrorCode;\n message: string;\n originalError?: Error;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://camera/examples\": `# @idealyst/camera — Examples\n\n## Photo Capture Screen\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Image, Text, IconButton } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\nimport type { PhotoResult } from '@idealyst/camera';\n\nfunction PhotoCaptureScreen() {\n const camera = useCamera({ autoRequestPermission: true, autoStart: true });\n const [photo, setPhoto] = useState<PhotoResult | null>(null);\n\n const handleCapture = async () => {\n const result = await camera.takePhoto({ format: 'jpeg', quality: 90 });\n setPhoto(result);\n };\n\n if (photo) {\n return (\n <View style={{ flex: 1 }}>\n <Image source={photo.uri} style={{ flex: 1 }} objectFit=\"contain\" />\n <View style={{ flexDirection: 'row', justifyContent: 'center' }} gap=\"md\" padding=\"md\">\n <Button onPress={() => setPhoto(null)} intent=\"secondary\">Retake</Button>\n <Button onPress={() => console.log('Save:', photo.uri)} intent=\"primary\">Use Photo</Button>\n </View>\n </View>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }} padding=\"md\">\n <IconButton\n icon={camera.torchActive ? 'flash' : 'flash-off'}\n onPress={() => camera.setTorch(!camera.torchActive)}\n />\n <Button onPress={handleCapture} intent=\"primary\" size=\"lg\">\n Capture\n </Button>\n <IconButton\n icon=\"camera-flip\"\n onPress={() => camera.switchDevice(\n camera.activeDevice?.position === 'front' ? 'back' : 'front'\n )}\n />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Video Recording\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\nimport type { VideoResult } from '@idealyst/camera';\n\nfunction VideoRecordingScreen() {\n const camera = useCamera({ autoRequestPermission: true, autoStart: true });\n const [video, setVideo] = useState<VideoResult | null>(null);\n\n const handleToggleRecording = async () => {\n if (camera.isRecording) {\n const result = await camera.stopRecording();\n setVideo(result);\n } else {\n await camera.startRecording({ format: 'mp4', audio: true });\n }\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n {camera.isRecording && (\n <Text style={{ position: 'absolute', top: 20, alignSelf: 'center', color: 'red' }}>\n REC {Math.round(camera.recordingDuration / 1000)}s\n </Text>\n )}\n <Button\n onPress={handleToggleRecording}\n intent={camera.isRecording ? 'error' : 'primary'}\n >\n {camera.isRecording ? 'Stop Recording' : 'Record Video'}\n </Button>\n {video && <Text>Video saved: {video.uri} ({Math.round(video.duration / 1000)}s)</Text>}\n </View>\n );\n}\n\\`\\`\\`\n\n## Permission Handling\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useCamera, requestPermission } from '@idealyst/camera';\n\nfunction CameraWithPermissions() {\n const camera = useCamera();\n\n const handleRequestPermission = async () => {\n const result = await requestPermission();\n if (result.camera === 'granted') {\n await camera.start();\n }\n };\n\n if (camera.permission?.camera !== 'granted') {\n return (\n <View padding=\"lg\" gap=\"md\" style={{ alignItems: 'center' }}>\n <Text>Camera permission is required</Text>\n <Button onPress={handleRequestPermission} intent=\"primary\">\n Grant Permission\n </Button>\n </View>\n );\n }\n\n // ... render camera preview\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Files Package Guides\n *\n * Comprehensive documentation for @idealyst/files.\n * File picking, upload, and management.\n */\n\nexport const filesGuides: Record<string, string> = {\n \"idealyst://files/overview\": `# @idealyst/files\n\nCross-platform file picking and upload package.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/files\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ File API + Drag & Drop |\n| iOS | ✅ UIDocumentPicker + Photos |\n| Android | ✅ Storage Access Framework + MediaStore |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n useFilePicker, // Hook for file picking\n useFileUpload, // Hook for file upload queue\n FilePickerButton, // Pre-built picker button component\n DropZone, // Drag-and-drop zone component (web)\n UploadProgress, // Upload progress display component\n FILE_PICKER_PRESETS, // Pre-configured picker configs\n UPLOAD_PRESETS, // Pre-configured upload configs\n} from '@idealyst/files';\n\\`\\`\\`\n\n> **Common mistakes:**\n> - The method is \\`pick()\\`, NOT \\`pickFiles()\\`\n> - \\`FileType\\` values are: \\`'image' | 'video' | 'audio' | 'document' | 'archive' | 'any'\\` — NOT \\`'pdf'\\` or \\`'doc'\\`\n> - \\`PickedFile\\` has \\`uri\\`, \\`name\\`, \\`size\\`, \\`type\\`, \\`extension\\` — dimensions are in optional \\`dimensions?: { width, height }\\`, NOT top-level \\`width\\`/\\`height\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { View, Button, Text } from '@idealyst/components';\nimport { useFilePicker } from '@idealyst/files';\n\nfunction FilePicker() {\n const picker = useFilePicker({ config: { allowedTypes: ['image'], multiple: true } });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled) {\n console.log('Picked:', result.files.map(f => f.name));\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick}>Select Images</Button>\n {picker.files.map(file => (\n <Text key={file.id}>{file.name} ({Math.round(file.size / 1024)}KB)</Text>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://files/api\": `# @idealyst/files — API Reference\n\n## Hooks\n\n### useFilePicker(options?)\n\nFile picker hook.\n\n\\`\\`\\`typescript\ninterface UseFilePickerOptions {\n config?: Partial<FilePickerConfig>; // Default picker configuration\n autoRequestPermission?: boolean; // Auto-request permission on mount\n}\n\\`\\`\\`\n\n**Returns \\`UseFilePickerResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | FilePickerStatus | Current picker status |\n| isPicking | boolean | Whether picker is open |\n| permission | PermissionResult \\\\| null | Permission result |\n| error | FilePickerError \\\\| null | Current error |\n| files | PickedFile[] | Last picked files |\n| pick | (config?) => Promise<FilePickerResult> | **Open file picker** |\n| captureFromCamera | (options?) => Promise<FilePickerResult> | Open camera to capture |\n| clear | () => void | Clear picked files |\n| checkPermission | () => Promise<PermissionResult> | Check permission |\n| requestPermission | () => Promise<PermissionResult> | Request permission |\n| validateFiles | (files) => ValidationResult | Validate files against config |\n| pickerRef | RefObject<IFilePicker \\\\| null> | Picker instance ref |\n\n---\n\n### useFileUpload(options?)\n\nFile upload queue hook.\n\n\\`\\`\\`typescript\ninterface UseFileUploadOptions {\n config?: Partial<Omit<UploadConfig, 'url'>>; // Default upload config (url set per-upload)\n autoStart?: boolean; // Auto-start uploads when added\n concurrency?: number; // Max concurrent uploads\n}\n\\`\\`\\`\n\n**Returns \\`UseFileUploadResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| queueStatus | QueueStatus | Queue status (total, pending, uploading, completed, failed) |\n| uploads | UploadProgressInfo[] | All uploads as array |\n| isUploading | boolean | Whether any upload is in progress |\n| isPaused | boolean | Whether queue is paused |\n| hasFailedUploads | boolean | Whether there are failed uploads |\n| addFiles | (files, config: { url: string } & Partial\\<UploadConfig\\>) => string[] | Add files to queue. Only \\`url\\` is required — e.g., \\`addFiles(files, { url: 'https://...' })\\`. All other fields have defaults. |\n| start | () => void | Start processing queue |\n| pause | () => void | Pause all uploads |\n| resume | () => void | Resume paused uploads |\n| cancel | (uploadId) => void | Cancel specific upload |\n| cancelAll | () => void | Cancel all uploads |\n| retry | (uploadId) => void | Retry failed upload |\n| retryAll | () => void | Retry all failed uploads |\n| remove | (uploadId) => void | Remove upload from queue |\n| clearCompleted | () => void | Clear completed uploads |\n| getUpload | (uploadId) => UploadProgressInfo? | Get upload by ID |\n\n---\n\n## Components\n\n### FilePickerButton\n\nPre-built button that opens file picker on press.\n\n\\`\\`\\`typescript\ninterface FilePickerButtonProps {\n children?: ReactNode;\n pickerConfig?: Partial<FilePickerConfig>;\n onPick?: (result: FilePickerResult) => void;\n onError?: (error: FilePickerError) => void;\n disabled?: boolean;\n loading?: boolean;\n variant?: 'solid' | 'outline' | 'ghost';\n size?: Size;\n intent?: Intent;\n leftIcon?: string; // Material Design Icon name\n style?: StyleProp<ViewStyle>;\n}\n\\`\\`\\`\n\n### DropZone\n\nDrag-and-drop zone for file selection (web only, renders as pressable on native).\n\n\\`\\`\\`typescript\ninterface DropZoneProps {\n onDrop?: (files: PickedFile[]) => void;\n onReject?: (rejected: RejectedFile[]) => void;\n config?: Partial<FilePickerConfig>;\n children?: ReactNode | ((state: DropZoneState) => ReactNode);\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n activeStyle?: StyleProp<ViewStyle>;\n rejectStyle?: StyleProp<ViewStyle>;\n}\n\\`\\`\\`\n\n### UploadProgress\n\nDisplays upload progress for a single file.\n\n\\`\\`\\`typescript\ninterface UploadProgressProps {\n upload: UploadProgressInfo;\n showFileName?: boolean;\n showFileSize?: boolean;\n showSpeed?: boolean;\n showETA?: boolean;\n showCancel?: boolean;\n showRetry?: boolean;\n onCancel?: () => void;\n onRetry?: () => void;\n variant?: 'linear' | 'circular';\n size?: Size;\n}\n\\`\\`\\`\n\n---\n\n## Types\n\n### FileType\n\n\\`\\`\\`typescript\ntype FileType = 'image' | 'video' | 'audio' | 'document' | 'archive' | 'any';\n\\`\\`\\`\n\n> **NOT** \\`'pdf'\\`, \\`'doc'\\`, \\`'xlsx'\\`, etc. Use \\`customMimeTypes\\` or \\`customExtensions\\` for specific formats.\n\n### PickedFile\n\n\\`\\`\\`typescript\ninterface PickedFile {\n id: string; // Unique identifier\n name: string; // Original file name\n size: number; // File size in bytes\n type: string; // MIME type\n uri: string; // File URI\n extension: string; // Extension without dot\n lastModified?: number; // Last modified timestamp\n dimensions?: { width: number; height: number }; // Image/video dimensions (optional)\n duration?: number; // Audio/video duration in ms (optional)\n thumbnailUri?: string; // Thumbnail URI (native only)\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n> **Note:** \\`dimensions\\` is an optional nested object — NOT top-level \\`width\\`/\\`height\\` properties.\n\n### FilePickerConfig\n\n\\`\\`\\`typescript\ninterface FilePickerConfig {\n allowedTypes: FileType[]; // Default: ['any']\n customMimeTypes?: string[]; // Custom MIME types (overrides allowedTypes)\n customExtensions?: string[]; // Custom extensions (e.g., ['.json', '.csv'])\n multiple: boolean; // Allow multiple selection (default: false)\n maxFiles?: number; // Max files when multiple\n maxFileSize?: number; // Max file size in bytes\n maxTotalSize?: number; // Max total size for all files\n allowCamera?: boolean; // Allow camera capture (native, default: true)\n allowLibrary?: boolean; // Allow photo library (native, default: true)\n imageQuality?: number; // Camera image quality 0-100 (default: 80)\n maxImageDimensions?: { width: number; height: number };\n includeThumbnails?: boolean; // Include thumbnails (default: false)\n}\n\\`\\`\\`\n\n### UploadConfig\n\n\\`\\`\\`typescript\n// Only 'url' is required — all other fields have sensible defaults\ninterface UploadConfig {\n url: string; // Target URL (REQUIRED)\n method?: 'POST' | 'PUT' | 'PATCH'; // Default: 'POST'\n headers?: Record<string, string>;\n fieldName?: string; // Form field name (default: 'file')\n formData?: Record<string, string | number | boolean>;\n multipart?: boolean; // Default: true\n concurrency?: number; // Concurrent uploads (default: 3)\n timeout?: number; // Request timeout ms (default: 30000)\n retryEnabled?: boolean; // Default: true\n maxRetries?: number; // Default: 3\n retryDelay?: 'fixed' | 'exponential'; // Default: 'exponential'\n retryDelayMs?: number; // Default: 1000\n chunkedUpload?: boolean; // Default: false\n chunkSize?: number; // Default: 10MB\n chunkedUploadThreshold?: number; // Default: 50MB\n backgroundUpload?: boolean; // Native only (default: false)\n}\n\\`\\`\\`\n\n### UploadProgressInfo\n\n\\`\\`\\`typescript\ninterface UploadProgressInfo {\n id: string; // Upload ID\n file: PickedFile; // The file being uploaded\n state: UploadState; // 'pending' | 'uploading' | 'paused' | 'completed' | 'failed' | 'cancelled'\n bytesUploaded: number; // Bytes uploaded so far\n bytesTotal: number; // Total bytes to upload\n percentage: number; // Progress 0-100\n speed: number; // Upload speed in bytes/sec\n estimatedTimeRemaining: number; // ETA in ms (NOT 'eta')\n retryCount: number; // Number of retry attempts\n error?: UploadError; // Error if state is 'failed'\n config: UploadConfig; // Upload configuration used\n}\n\\`\\`\\`\n\n> **IMPORTANT:** The property is \\`state\\` (NOT \\`status\\`) and \\`percentage\\` (NOT \\`progress\\`).\n\n### FilePickerResult\n\n\\`\\`\\`typescript\ninterface FilePickerResult {\n cancelled: boolean;\n files: PickedFile[];\n rejected: RejectedFile[];\n error?: FilePickerError;\n}\n\\`\\`\\`\n\n### Presets\n\n\\`\\`\\`typescript\n// FILE_PICKER_PRESETS\nconst presets = {\n avatar: { allowedTypes: ['image'], multiple: false, maxFileSize: 5MB, ... },\n document: { allowedTypes: ['document'], multiple: false, ... },\n documents: { allowedTypes: ['document'], multiple: true, ... },\n image: { allowedTypes: ['image'], multiple: false, ... },\n images: { allowedTypes: ['image'], multiple: true, ... },\n video: { allowedTypes: ['video'], multiple: false, ... },\n files: { allowedTypes: ['any'], multiple: true, ... },\n};\n\n// UPLOAD_PRESETS\nconst uploadPresets = {\n simple: { concurrency: 1, ... },\n largeFile: { chunkedUpload: true, ... },\n background: { backgroundUpload: true, ... },\n reliable: { retryEnabled: true, maxRetries: 5, ... },\n};\n\\`\\`\\`\n`,\n\n \"idealyst://files/examples\": `# @idealyst/files — Examples\n\n## Basic File Picker\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, List } from '@idealyst/components';\nimport { useFilePicker } from '@idealyst/files';\n\nfunction DocumentPicker() {\n const picker = useFilePicker({\n config: { allowedTypes: ['document'], multiple: true, maxFiles: 5 },\n });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled) {\n console.log('Selected:', result.files.length, 'files');\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick} leftIcon=\"file-document-outline\">\n Select Documents\n </Button>\n <List>\n {picker.files.map(file => (\n <View key={file.id} style={{ flexDirection: 'row', justifyContent: 'space-between' }} padding=\"sm\">\n <Text>{file.name}</Text>\n <Text typography=\"caption\" color=\"secondary\">{Math.round(file.size / 1024)}KB</Text>\n </View>\n ))}\n </List>\n </View>\n );\n}\n\\`\\`\\`\n\n## Image Picker with Preview\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Image, Text } from '@idealyst/components';\nimport { useFilePicker, FILE_PICKER_PRESETS } from '@idealyst/files';\n\nfunction ImagePicker() {\n const picker = useFilePicker({ config: FILE_PICKER_PRESETS.images });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => picker.pick()} leftIcon=\"image-multiple\">\n Select Images\n </Button>\n <View style={{ flexDirection: 'row', flexWrap: 'wrap' }} gap=\"sm\">\n {picker.files.map(file => (\n <Image\n key={file.id}\n source={file.uri}\n style={{ width: 100, height: 100, borderRadius: 8 }}\n objectFit=\"cover\"\n />\n ))}\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## File Upload with UploadProgress (Recommended)\n\nUse the pre-built \\`UploadProgress\\` component for the best experience:\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Badge } from '@idealyst/components';\nimport { useFilePicker, useFileUpload, UploadProgress } from '@idealyst/files';\n\nfunction FileUploadScreen() {\n const picker = useFilePicker({ config: { allowedTypes: ['any'], multiple: true } });\n const uploader = useFileUpload({ concurrency: 2 });\n\n const handlePickAndUpload = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n uploader.addFiles(result.files, { url: 'https://api.example.com/upload' });\n uploader.start();\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePickAndUpload} leftIcon=\"upload\">\n Pick & Upload\n </Button>\n\n {/* Queue summary */}\n {uploader.uploads.length > 0 && (\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Badge intent=\"success\" type=\"filled\">{uploader.queueStatus.completed} done</Badge>\n <Badge intent=\"info\" type=\"filled\">{uploader.queueStatus.uploading} uploading</Badge>\n <Badge intent=\"neutral\" type=\"filled\">{uploader.queueStatus.pending} pending</Badge>\n </View>\n )}\n\n {/* Per-file progress — use the pre-built UploadProgress component */}\n {uploader.uploads.map(upload => (\n <UploadProgress\n key={upload.id}\n upload={upload}\n showFileName\n showFileSize\n showSpeed\n showCancel={upload.state === 'uploading'}\n showRetry={upload.state === 'failed'}\n onCancel={() => uploader.cancel(upload.id)}\n onRetry={() => uploader.retry(upload.id)}\n />\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Manual Upload Progress (Custom UI)\n\nIf you need custom upload UI, use the \\`upload.state\\` and \\`upload.percentage\\` properties:\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Progress } from '@idealyst/components';\nimport { useFilePicker, useFileUpload } from '@idealyst/files';\n\nfunction CustomUploadUI() {\n const picker = useFilePicker({ config: { allowedTypes: ['any'], multiple: true } });\n const uploader = useFileUpload({ autoStart: true, concurrency: 2 });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n uploader.addFiles(result.files, { url: 'https://api.example.com/upload' });\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick} leftIcon=\"upload\">Pick & Upload</Button>\n {uploader.uploads.map(upload => (\n <View key={upload.id} gap=\"xs\">\n <Text typography=\"body2\" weight=\"medium\">{upload.file.name}</Text>\n <Progress\n type=\"linear\"\n value={upload.percentage}\n intent={upload.state === 'completed' ? 'success' : upload.state === 'failed' ? 'danger' : 'info'}\n />\n <Text typography=\"caption\" color=\"secondary\">\n {upload.state} — {upload.percentage}%\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom MIME Types\n\n\\`\\`\\`tsx\n// Pick specific file types using customMimeTypes\nconst picker = useFilePicker({\n config: {\n allowedTypes: ['document'], // Base category\n customMimeTypes: [\n 'application/pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/csv',\n ],\n customExtensions: ['.pdf', '.docx', '.csv'],\n },\n});\n\\`\\`\\`\n\n## Drop Zone (Web)\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { DropZone } from '@idealyst/files';\n\nfunction FileDropArea() {\n return (\n <DropZone\n config={{ allowedTypes: ['image'], maxFileSize: 10 * 1024 * 1024 }}\n onDrop={(files) => console.log('Dropped:', files)}\n onReject={(rejected) => console.log('Rejected:', rejected)}\n >\n {(state) => (\n <View\n padding=\"xl\"\n style={{ alignItems: 'center' }}\n border={state.isDragActive ? 'thick' : 'thin'}\n >\n <Text>{state.isDragActive ? 'Drop files here' : 'Drag files here or click to browse'}</Text>\n </View>\n )}\n </DropZone>\n );\n}\n\\`\\`\\`\n\n## Pre-built FilePickerButton\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { FilePickerButton } from '@idealyst/files';\n\nfunction SimpleUpload() {\n return (\n <FilePickerButton\n pickerConfig={{ allowedTypes: ['image'], multiple: false }}\n onPick={(result) => {\n if (!result.cancelled) {\n console.log('File:', result.files[0]?.name);\n }\n }}\n onError={(error) => console.error('Picker error:', error)}\n intent=\"primary\"\n leftIcon=\"image\"\n >\n Upload Photo\n </FilePickerButton>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * OAuth Client Package Guides\n *\n * Comprehensive documentation for @idealyst/oauth-client.\n */\n\nexport const oauthClientGuides: Record<string, string> = {\n \"idealyst://oauth-client/overview\": `# @idealyst/oauth-client\n\nCross-platform OAuth2 client with a simple, generic API.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/oauth-client\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Popup/redirect flow |\n| iOS | ✅ ASWebAuthenticationSession |\n| Android | ✅ Custom Tabs |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { createOAuthClient } from '@idealyst/oauth-client';\nimport type { OAuthConfig, OAuthResult, OAuthCallbackParams } from '@idealyst/oauth-client';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: 'https://api.yourapp.com/auth/google',\n redirectUrl: 'com.yourapp://oauth/callback',\n});\n\n// In your component:\nconst handleLogin = async () => {\n try {\n const result = await googleAuth.authorize();\n console.log('Auth code:', result.code);\n } catch (error) {\n console.error('Auth failed:', error);\n }\n};\n\\`\\`\\`\n`,\n\n \"idealyst://oauth-client/api\": `# @idealyst/oauth-client — API Reference\n\n## createOAuthClient(config)\n\nFactory function to create an OAuth client.\n\n\\`\\`\\`typescript\nfunction createOAuthClient<T = OAuthResult>(config: OAuthConfig<T>): OAuthClient<T>;\n\\`\\`\\`\n\n### OAuthConfig<T>\n\n\\`\\`\\`typescript\ninterface OAuthConfig<T = OAuthResult> {\n /** OAuth endpoint URL (your server's OAuth initiation endpoint) */\n oauthUrl: string;\n\n /** Redirect URL for the client app (e.g., \"com.yourapp://oauth/callback\") */\n redirectUrl: string;\n\n /** Additional query parameters to send to OAuth endpoint */\n additionalParameters?: Record<string, string>;\n\n /**\n * Transform raw callback params to desired type.\n * If not provided, extracts code + state from callback params.\n */\n transformCallback?: (params: OAuthCallbackParams) => T;\n}\n\\`\\`\\`\n\n### OAuthClient<T>\n\n\\`\\`\\`typescript\ninterface OAuthClient<T = OAuthResult> {\n /** Initiate OAuth flow. Opens browser/webview, returns result on completion. */\n authorize(): Promise<T>;\n}\n\\`\\`\\`\n\n### OAuthResult (default)\n\n\\`\\`\\`typescript\ninterface OAuthResult {\n code: string; // Authorization code\n state?: string; // CSRF state token\n}\n\\`\\`\\`\n\n### OAuthCallbackParams\n\n\\`\\`\\`typescript\ntype OAuthCallbackParams = Record<string, string | undefined>;\n\\`\\`\\`\n\nAll query parameters from the OAuth redirect are available here.\n`,\n\n \"idealyst://oauth-client/examples\": `# @idealyst/oauth-client — Examples\n\n## Basic Google OAuth\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: 'https://api.yourapp.com/auth/google',\n redirectUrl: 'com.yourapp://oauth/callback',\n});\n\nfunction LoginScreen() {\n const [loading, setLoading] = useState(false);\n\n const handleGoogleLogin = async () => {\n setLoading(true);\n try {\n const result = await googleAuth.authorize();\n // Send result.code to your backend to exchange for tokens\n console.log('Authorization code:', result.code);\n } catch (error) {\n console.error('Login failed:', error);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <View padding=\"lg\" gap=\"md\">\n <Button\n onPress={handleGoogleLogin}\n intent=\"primary\"\n loading={loading}\n leftIcon=\"google\"\n >\n Sign in with Google\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Callback Transform\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\ninterface CustomAuthResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\n// Some OAuth servers return tokens directly in the callback\nconst auth = createOAuthClient<CustomAuthResult>({\n oauthUrl: 'https://api.yourapp.com/auth/provider',\n redirectUrl: 'com.yourapp://oauth/callback',\n additionalParameters: {\n response_type: 'token',\n scope: 'openid profile email',\n },\n transformCallback: (params) => ({\n accessToken: params.access_token || '',\n refreshToken: params.refresh_token || '',\n expiresIn: parseInt(params.expires_in || '3600', 10),\n }),\n});\n\\`\\`\\`\n\n## Multiple Providers\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\nimport { config } from '@idealyst/config';\n\nconst REDIRECT_URL = config.getRequired('OAUTH_REDIRECT_URL');\n\nconst googleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/google',\n redirectUrl: REDIRECT_URL,\n});\n\nconst appleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/apple',\n redirectUrl: REDIRECT_URL,\n});\n\nconst githubAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/github',\n redirectUrl: REDIRECT_URL,\n});\n\n// Use in component:\nfunction SocialLogin() {\n return (\n <View gap=\"sm\">\n <Button onPress={() => googleAuth.authorize()} leftIcon=\"google\">Google</Button>\n <Button onPress={() => appleAuth.authorize()} leftIcon=\"apple\">Apple</Button>\n <Button onPress={() => githubAuth.authorize()} leftIcon=\"github\">GitHub</Button>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Animate Package Guides\n *\n * Comprehensive documentation for @idealyst/animate.\n */\n\nexport const animateGuides: Record<string, string> = {\n \"idealyst://animate/overview\": `# @idealyst/animate\n\nCross-platform animation hooks using CSS transitions (web) and Reanimated (native).\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/animate\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ CSS Transitions / Animations |\n| iOS | ✅ react-native-reanimated |\n| Android | ✅ react-native-reanimated |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n useAnimatedStyle, // Animate style changes\n useAnimatedValue, // Animated numeric value with interpolation\n usePresence, // Enter/exit animations\n useGradientBorder, // Animated gradient borders\n withAnimated, // HOC to wrap any component for animation\n} from '@idealyst/animate';\n\\`\\`\\`\n\n> **There is NO \\`useSequence\\` or \\`useKeyframes\\` export.** For multi-step animations, chain \\`useAnimatedStyle\\` calls with state changes. For looping animations, use \\`useAnimatedValue\\` with repeated \\`set()\\` calls.\n\n## Easing Values\n\nEasing values use **camelCase** (NOT CSS hyphenated format). Available values:\n\\`\\`\\`\n'ease' | 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' |\n'spring' | 'standard' | 'accelerate' | 'decelerate' |\n'springStiff' | 'springBouncy'\n\\`\\`\\`\n> **IMPORTANT:** Use \\`'easeOut'\\` — NOT \\`'ease-out'\\`. All easing values are camelCase.\n\n## Key Concepts\n\n1. **Theme integration** — Duration and easing values come from \\`@idealyst/theme/animation\\`\n2. **Transform syntax** — Simplified object syntax: \\`{ x: 10, y: 20, scale: 1.2 }\\` instead of arrays\n3. **Platform overrides** — Customize animation behavior per-platform\n4. **GPU-accelerated** — Prefers opacity + transform for best performance\n`,\n\n \"idealyst://animate/api\": `# @idealyst/animate — API Reference\n\n## Available Exports (COMPLETE LIST)\n\n\\`\\`\\`typescript\nimport {\n useAnimatedStyle, // Animate style changes\n useAnimatedValue, // Animated numeric value with interpolation\n usePresence, // Enter/exit animations\n useGradientBorder, // Animated gradient borders\n withAnimated, // HOC to wrap any component for animation\n} from '@idealyst/animate';\n\\`\\`\\`\n\n> **There are exactly 5 exports.** There is NO \\`useSequence\\`, \\`useKeyframes\\`, \\`useSpring\\`, or \\`useTransition\\`.\n> For multi-step animations, use \\`useAnimatedStyle\\` with state changes. For looping, use \\`useAnimatedValue\\` with repeated \\`set()\\` calls.\n\n## Easing Values (EXACT string literals)\n\nEasing values are **camelCase** — NOT CSS kebab-case. Using \\`'ease-out'\\` will cause a TypeScript error.\n\n| Valid (use these) | INVALID (do NOT use) |\n|---|---|\n| \\`'easeOut'\\` | ~~\\`'ease-out'\\`~~ |\n| \\`'easeIn'\\` | ~~\\`'ease-in'\\`~~ |\n| \\`'easeInOut'\\` | ~~\\`'ease-in-out'\\`~~ |\n\nAll valid easing values:\n\\`\\`\\`typescript\ntype EasingKey = 'ease' | 'linear' | 'easeIn' | 'easeOut' | 'easeInOut'\n | 'spring' | 'standard' | 'accelerate' | 'decelerate'\n | 'springStiff' | 'springBouncy';\n\\`\\`\\`\n\n---\n\n## Hooks\n\n### useAnimatedStyle(style, options?)\n\nAnimate any style property changes. Returns an animated style object.\n\n\\`\\`\\`typescript\ninterface AnimationOptions {\n duration?: Duration; // ms or theme token key\n easing?: EasingKey; // Theme easing key\n delay?: number; // Delay before animation (ms)\n}\n\ninterface UseAnimatedStyleOptions extends AnimationOptions {\n web?: AnimationOptions & { transition?: string }; // Web overrides\n native?: AnimationOptions & { useSpring?: boolean; springType?: SpringType }; // Native overrides\n}\n\\`\\`\\`\n\n**How it works:** The hook watches the style object for changes. When any value changes (e.g., opacity goes from 0 to 1), it animates the transition. On mount, the initial values are applied immediately without animation. To create entrance animations, use \\`usePresence\\` instead, or toggle state after mount with \\`useEffect\\`.\n\n**Usage:**\n\\`\\`\\`tsx\n// Reactive: style changes animate automatically\nconst style = useAnimatedStyle(\n { opacity: isVisible ? 1 : 0, transform: { y: isVisible ? 0 : 20 } },\n { duration: 300, easing: 'easeOut' }\n);\n// Apply: <View style={style} />\n\n// Entrance animation pattern: start hidden, toggle after mount\nconst [ready, setReady] = useState(false);\nuseEffect(() => { setReady(true); }, []);\nconst entranceStyle = useAnimatedStyle(\n { opacity: ready ? 1 : 0, transform: { y: ready ? 0 : 20 } },\n { duration: 400, easing: 'easeOut' }\n);\n\\`\\`\\`\n\n---\n\n### useAnimatedValue(initialValue: number)\n\nCreate an animated numeric value with interpolation support. Best for **continuous/looping** animations where you control timing with \\`set()\\` calls.\n\n> **REQUIRED:** The \\`initialValue\\` argument is mandatory. Calling \\`useAnimatedValue()\\` without an argument causes TS2554. Always pass an initial number: \\`useAnimatedValue(0)\\` or \\`useAnimatedValue(1)\\`.\n\n**Returns \\`AnimatedValue\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| value | number (readonly) | Current snapshot (NOT a live binding) |\n| set | (target, options?) => void | Animate to target value |\n| setImmediate | (target) => void | Set value without animation |\n| interpolate | (config) => T | Interpolate to another range |\n\n> **WARNING:** \\`animatedValue.value\\` is a plain number snapshot. Do NOT use it directly in inline styles — it will not update during animation. Instead, use \\`useAnimatedStyle\\` with state for reactive animations, or use \\`interpolate()\\` for derived animated values.\n\n\\`\\`\\`tsx\n// WRONG: pulse.value is a snapshot, not a live animated binding\n// <View style={{ transform: { scale: pulse.value } }} /> // Will NOT animate\n\n// CORRECT: Use useAnimatedStyle with state for pulsing animations\nconst [scale, setScale] = useState(1);\nconst style = useAnimatedStyle(\n { transform: { scale } },\n { duration: 600, easing: 'easeInOut' }\n);\n// Then toggle: setScale(1.3) / setScale(1) in setInterval\n\n// CORRECT: Use useAnimatedValue for interpolation\nconst progress = useAnimatedValue(0);\n// progress.set(1, { duration: 1000 }); // animate 0 -> 1\n// const opacity = progress.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] });\n\\`\\`\\`\n\n\\`\\`\\`typescript\ninterface InterpolationConfig<T> {\n inputRange: number[];\n outputRange: T[];\n extrapolate?: 'extend' | 'clamp' | 'identity';\n}\n\\`\\`\\`\n\n---\n\n### usePresence(isPresent, options)\n\nEnter/exit animations for conditional rendering.\n\n\\`\\`\\`typescript\ninterface UsePresenceOptions extends AnimationOptions {\n enter: AnimatableProperties; // Style when entering/visible\n exit: AnimatableProperties; // Style when exiting/hidden\n initial?: AnimatableProperties; // Initial style (defaults to exit)\n}\n\\`\\`\\`\n\n**Returns \\`UsePresenceResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| isPresent | boolean | Whether element should be rendered |\n| style | AnimatableStyle | Animated style |\n| exit | () => void | Trigger exit animation manually |\n\n---\n\n### useGradientBorder(options)\n\nAnimated gradient borders.\n\n\\`\\`\\`typescript\ninterface UseGradientBorderOptions {\n colors: string[]; // Gradient colors\n borderWidth?: number; // Border width in px\n borderRadius?: number; // Border radius in px\n duration?: Duration; // Animation duration\n animation?: 'spin' | 'pulse' | 'wave'; // Animation type\n active?: boolean; // Whether active\n}\n\\`\\`\\`\n\n**Returns \\`UseGradientBorderResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| containerStyle | AnimatableStyle | Style for outer container |\n| contentStyle | AnimatableStyle | Style for inner content |\n| isReady | boolean | Whether gradient CSS injected (web) |\n\n---\n\n## Import Checklist (copy this pattern)\n\nWhen writing animation code, start with this import and ONLY use these hooks:\n\n\\`\\`\\`tsx\n// CORRECT — the ONLY available imports from @idealyst/animate\nimport { useAnimatedStyle, useAnimatedValue, usePresence, useGradientBorder, withAnimated } from '@idealyst/animate';\n\n// WRONG — these do NOT exist and will cause TS2305 errors:\n// import { useSequence } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useKeyframes } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useSpring } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useTransition } from '@idealyst/animate'; // DOES NOT EXIST\n\\`\\`\\`\n\n**How to achieve common patterns WITHOUT the non-existent hooks:**\n- **Sequence/multi-step**: Use \\`useAnimatedStyle\\` + \\`setTimeout\\` to change state at each step\n- **Keyframes/looping**: Use \\`useAnimatedValue\\` + \\`setInterval\\` to call \\`.set()\\` repeatedly\n- **Spring**: Use \\`useAnimatedStyle\\` with \\`easing: 'spring'\\` or \\`easing: 'springBouncy'\\`\n\n---\n\n## Animatable Properties\n\nOnly certain CSS properties animate smoothly. Stick to these for best results:\n\n| Animatable | NOT animatable (avoid in useAnimatedStyle) |\n|---|---|\n| \\`opacity\\` | \\`overflow\\` |\n| \\`transform\\` (x, y, scale, rotate) | \\`display\\` |\n| \\`backgroundColor\\` | \\`position\\` |\n| \\`borderColor\\` | \\`zIndex\\` |\n| \\`maxHeight\\` (use for expand/collapse) | \\`pointerEvents\\` |\n| \\`width\\`, \\`height\\` | \\`justifyContent\\`, \\`alignItems\\` |\n| \\`borderRadius\\` | \\`flexDirection\\` |\n| \\`padding\\`, \\`margin\\` | |\n\nFor expand/collapse, animate \\`opacity\\` + \\`maxHeight\\` together. Do NOT include \\`overflow: 'hidden'\\` inside the animated style object — set it as a static style on the parent View instead.\n\n---\n\n## Transform Syntax\n\nUse simplified object syntax instead of React Native arrays:\n\n\\`\\`\\`typescript\n// Recommended: object syntax\ntransform: { x: 10, y: 20, scale: 1.2, rotate: 45 }\n\n// Legacy: array syntax (still supported)\ntransform: [{ translateX: 10 }, { translateY: 20 }, { scale: 1.2 }]\n\\`\\`\\`\n\n| Property | Type | Maps to |\n|----------|------|---------|\n| x | number | translateX |\n| y | number | translateY |\n| scale | number | scale |\n| scaleX | number | scaleX |\n| scaleY | number | scaleY |\n| rotate | number \\\\| string | rotate |\n| rotateX | string | rotateX |\n| rotateY | string | rotateY |\n| skewX | string | skewX |\n| skewY | string | skewY |\n| perspective | number | perspective |\n`,\n\n \"idealyst://animate/examples\": `# @idealyst/animate — Examples\n\n> **STOP — Before writing animation code, verify your imports and these critical rules.**\n> The ONLY hooks exported from \\`@idealyst/animate\\` are: \\`useAnimatedStyle\\`, \\`useAnimatedValue\\`, \\`usePresence\\`, \\`useGradientBorder\\`, \\`withAnimated\\`.\n> There is NO \\`useSequence\\`, \\`useKeyframes\\`, \\`useSpring\\`, or \\`useTransition\\`.\n> Easing values are camelCase: \\`'easeOut'\\`, NOT \\`'ease-out'\\`.\n> \\`useAnimatedValue\\` REQUIRES an initial number argument: \\`useAnimatedValue(0)\\` — calling \\`useAnimatedValue()\\` without arguments causes TS2554.\n> \\`useRef\\` REQUIRES an initial argument in React 19: \\`useRef<T | null>(null)\\` — writing \\`useRef<T>()\\` causes TS2554.\n> For expand/collapse: NEVER use \\`{condition && <View style={animStyle}>}\\` — this destroys the element before exit animations run. Always render the element and animate opacity/maxHeight.\n\n## Fade In/Out\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction FadeExample() {\n const [visible, setVisible] = useState(true);\n\n const style = useAnimatedStyle(\n { opacity: visible ? 1 : 0, transform: { y: visible ? 0 : -10 } },\n { duration: 300, easing: 'easeOut' }\n );\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => setVisible(!visible)}>Toggle</Button>\n <View style={style}>\n <Text>Hello, animated world!</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Animated Counter\n\n\\`\\`\\`tsx\nimport React, { useState, useCallback } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useAnimatedValue } from '@idealyst/animate';\n\nfunction AnimatedCounter() {\n const [count, setCount] = useState(0);\n const animValue = useAnimatedValue(0);\n\n const increment = useCallback(() => {\n const next = count + 1;\n setCount(next);\n animValue.set(next, { duration: 500, easing: 'easeOut' });\n }, [count]);\n\n const color = animValue.interpolate({\n inputRange: [0, 5, 10],\n outputRange: ['#4CAF50', '#FFC107', '#F44336'],\n extrapolate: 'clamp',\n });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text style={{ fontSize: 48, color }}>\n {count}\n </Text>\n <Button onPress={increment}>Increment</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Bounce / Sequence Animation (NO useSequence — use state + setTimeout)\n\n> **There is no \\`useSequence\\` hook.** For multi-step animations, change state with \\`setTimeout\\` and let \\`useAnimatedStyle\\` animate each change.\n\n\\`\\`\\`tsx\nimport React, { useState, useCallback } from 'react';\nimport { View, Button } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction BounceExample() {\n const [scale, setScale] = useState(1);\n\n const style = useAnimatedStyle(\n { transform: { scale } },\n { duration: 200, easing: 'easeOut' }\n );\n\n // Sequence: scale up -> overshoot -> settle. Just change state at each step.\n const bounce = useCallback(() => {\n setScale(1.2);\n setTimeout(() => setScale(0.9), 200);\n setTimeout(() => setScale(1), 350);\n }, []);\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ alignItems: 'center' }}>\n <View style={[{ width: 100, height: 100, backgroundColor: '#4CAF50', borderRadius: 12 }, style]} />\n <Button onPress={bounce}>Bounce</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Enter/Exit with usePresence\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Card, Text } from '@idealyst/components';\nimport { usePresence } from '@idealyst/animate';\n\nfunction PresenceExample() {\n const [show, setShow] = useState(false);\n const { isPresent, style } = usePresence(show, {\n enter: { opacity: 1, transform: { y: 0, scale: 1 } },\n exit: { opacity: 0, transform: { y: -20, scale: 0.95 } },\n duration: 250,\n easing: 'easeOut',\n });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => setShow(!show)}>\n {show ? 'Hide' : 'Show'} Card\n </Button>\n {isPresent && (\n <Card style={style} padding=\"md\">\n <Text>Animated card content</Text>\n </Card>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Pulsing / Looping / Keyframe-like Animation (NO useKeyframes — use useAnimatedValue + setInterval)\n\n> **There is no \\`useKeyframes\\` hook.** For continuous/looping animations, use \\`useAnimatedValue\\` with \\`setInterval\\` to repeatedly call \\`.set()\\`.\n\n\\`\\`\\`tsx\nimport React, { useState, useEffect, useRef } from 'react';\nimport { View } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction PulseAnimation() {\n const [scale, setScale] = useState(1);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const animStyle = useAnimatedStyle(\n { transform: { scale } },\n { duration: 500, easing: 'easeInOut' }\n );\n\n useEffect(() => {\n let growing = true;\n intervalRef.current = setInterval(() => {\n setScale(growing ? 1.1 : 1);\n growing = !growing;\n }, 500);\n return () => clearInterval(intervalRef.current!);\n }, []);\n\n return (\n <View padding=\"md\" style={{ alignItems: 'center' }}>\n <View\n style={[{\n width: 80,\n height: 80,\n borderRadius: 40,\n backgroundColor: '#2196F3',\n }, animStyle]}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Expand / Collapse (animate height + opacity — do NOT use conditional rendering)\n\n> **Do NOT use \\`{expanded && <View style={animStyle}>...}</View>}\\`** — conditional rendering removes the element before the exit animation runs. Instead, always render the content and animate its height/opacity.\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text, Card, Pressable, Icon } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction ExpandableSection({ title, children }: { title: string; children: React.ReactNode }) {\n const [expanded, setExpanded] = useState(false);\n\n // Animate opacity + maxHeight. overflow is NOT animatable — set it as a static style.\n const contentStyle = useAnimatedStyle(\n {\n opacity: expanded ? 1 : 0,\n maxHeight: expanded ? 500 : 0,\n },\n { duration: 300, easing: 'easeOut' }\n );\n\n const iconStyle = useAnimatedStyle(\n { transform: { rotate: expanded ? 180 : 0 } },\n { duration: 200, easing: 'easeOut' }\n );\n\n return (\n <Card>\n <Pressable onPress={() => setExpanded(!expanded)}>\n <View padding=\"md\" style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <Text typography=\"subtitle1\" weight=\"bold\">{title}</Text>\n <View style={iconStyle}>\n <Icon name=\"chevron-down\" />\n </View>\n </View>\n </Pressable>\n {/* Always render — animate opacity + maxHeight instead of conditional rendering */}\n <View style={[{ overflow: 'hidden' }, contentStyle]} padding=\"md\" paddingVertical=\"sm\">\n {children}\n </View>\n </Card>\n );\n}\n\\`\\`\\`\n\n## useRef in React 19\n\n> **React 19 requires an initial argument for useRef.** Writing \\`useRef<T>()\\` causes TS2554. Always pass an initial value.\n\n\\`\\`\\`typescript\n// CORRECT\nconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\nconst countRef = useRef<number>(0);\nconst lottieRef = useRef<LottieRef>(null);\n\n// WRONG — TS2554: Expected 1 arguments, but got 0\n// const intervalRef = useRef<ReturnType<typeof setInterval>>();\n// const countRef = useRef<number>();\n\\`\\`\\`\n\n## Gradient Border\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { useGradientBorder } from '@idealyst/animate';\n\nfunction GradientBorderCard() {\n const { containerStyle, contentStyle } = useGradientBorder({\n colors: ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96E6A1'],\n borderWidth: 2,\n borderRadius: 12,\n animation: 'spin',\n duration: 3000,\n active: true,\n });\n\n return (\n <View style={containerStyle}>\n <View style={[contentStyle, { padding: 20 }]}>\n <Text>Content with animated gradient border</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * DataGrid Package Guides\n *\n * Comprehensive documentation for @idealyst/datagrid.\n * Virtualized data grid for tabular data display.\n */\n\nexport const datagridGuides: Record<string, string> = {\n \"idealyst://datagrid/overview\": `# @idealyst/datagrid\n\nHigh-performance, virtualized data grid for displaying tabular data.\n\n> **Note:** DataGrid is for structured tabular data with columns. For general lists, use the \\`List\\` component from \\`@idealyst/components\\` with \\`children\\`.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/datagrid\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Virtualized scrolling |\n| iOS | ✅ Virtualized scrolling |\n| Android | ✅ Virtualized scrolling |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column, DataGridProps } from '@idealyst/datagrid';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n role: string;\n}\n\nconst columns: Column<User>[] = [\n { key: 'name', header: 'Name', width: 200 },\n { key: 'email', header: 'Email', width: 250 },\n { key: 'role', header: 'Role', width: 120 },\n];\n\nfunction UserTable({ users }: { users: User[] }) {\n return (\n <DataGrid\n data={users}\n columns={columns}\n rowHeight={48}\n headerHeight={52}\n virtualized\n stickyHeader\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datagrid/api\": `# @idealyst/datagrid — API Reference\n\n## DataGrid<T>\n\nThe main data grid component.\n\n### DataGridProps<T>\n\n\\`\\`\\`typescript\ninterface DataGridProps<T = any> {\n /** Array of data objects */\n data: T[];\n\n /** Column definitions */\n columns: Column<T>[];\n\n /** Row height in pixels (default varies by platform) */\n rowHeight?: number;\n\n /** Header row height in pixels */\n headerHeight?: number;\n\n /** Callback when a row is clicked/pressed */\n onRowClick?: (row: T, index: number) => void;\n\n /** Callback when a column header is clicked for sorting */\n onSort?: (column: Column<T>, direction: 'asc' | 'desc') => void;\n\n /** Callback when a column is resized */\n onColumnResize?: (columnKey: string, width: number) => void;\n\n /** Resize mode: 'indicator' (default) or 'live' */\n columnResizeMode?: 'indicator' | 'live';\n\n /** Enable virtualized scrolling for large datasets */\n virtualized?: boolean;\n\n /** Grid height (required for virtualization) */\n height?: number | string;\n\n /** Grid width */\n width?: number | string;\n\n /** Container style */\n style?: ViewStyle;\n\n /** Header row style */\n headerStyle?: ViewStyle;\n\n /** Default cell style */\n cellStyle?: ViewStyle;\n\n /** Row style — static or dynamic based on row data */\n rowStyle?: ViewStyle | ((row: T, index: number) => ViewStyle);\n\n /** Indices of selected rows */\n selectedRows?: number[];\n\n /** Callback when selection changes */\n onSelectionChange?: (selectedRows: number[]) => void;\n\n /** Enable multi-row selection */\n multiSelect?: boolean;\n\n /** Stick header to top when scrolling */\n stickyHeader?: boolean;\n}\n\\`\\`\\`\n\n### Column<T>\n\n\\`\\`\\`typescript\ninterface Column<T = any> {\n /** Unique column key (also used as data accessor if no accessor fn) */\n key: string;\n\n /** Column header text */\n header: string;\n\n /** Fixed column width in pixels */\n width?: number;\n\n /** Minimum column width */\n minWidth?: number;\n\n /** Maximum column width */\n maxWidth?: number;\n\n /** Allow column resizing */\n resizable?: boolean;\n\n /** Allow sorting by this column */\n sortable?: boolean;\n\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n\n /** Custom data accessor function */\n accessor?: (row: T) => any;\n\n /** Custom cell renderer */\n render?: (value: any, row: T, index: number) => React.ReactNode;\n\n /** Custom header renderer (overrides header string) */\n renderHeader?: () => React.ReactNode;\n\n /** Header cell style */\n headerStyle?: ViewStyle;\n\n /** Cell style — static or dynamic */\n cellStyle?: ViewStyle | ((value: any, row: T) => ViewStyle);\n}\n\\`\\`\\`\n\n### Sub-components\n\n\\`\\`\\`typescript\ninterface CellProps {\n children: React.ReactNode;\n style?: ViewStyle;\n width?: number;\n onPress?: () => void;\n}\n\ninterface RowProps {\n children: React.ReactNode;\n style?: ViewStyle;\n onPress?: () => void;\n selected?: boolean;\n}\n\ninterface HeaderCellProps {\n children: React.ReactNode;\n style?: ViewStyle;\n width?: number;\n sortable?: boolean;\n sortDirection?: 'asc' | 'desc' | null;\n onSort?: () => void;\n resizable?: boolean;\n onResize?: (width: number) => void;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datagrid/examples\": `# @idealyst/datagrid — Examples\n\n## Basic Table\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface Product {\n id: number;\n name: string;\n price: number;\n category: string;\n stock: number;\n}\n\nconst columns: Column<Product>[] = [\n { key: 'name', header: 'Product Name', width: 200 },\n { key: 'category', header: 'Category', width: 150 },\n {\n key: 'price',\n header: 'Price',\n width: 100,\n align: 'right',\n render: (value) => \\`$\\${value.toFixed(2)}\\`,\n },\n {\n key: 'stock',\n header: 'Stock',\n width: 80,\n align: 'center',\n cellStyle: (value) => ({\n color: value < 10 ? 'red' : 'green',\n }),\n },\n];\n\nfunction ProductTable({ products }: { products: Product[] }) {\n return <DataGrid data={products} columns={columns} />;\n}\n\\`\\`\\`\n\n## Sortable with Selection\n\n\\`\\`\\`tsx\nimport React, { useState, useMemo } from 'react';\nimport { View, Text, Button } from '@idealyst/components';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface Employee {\n id: number;\n name: string;\n department: string;\n salary: number;\n}\n\nfunction EmployeeGrid({ employees }: { employees: Employee[] }) {\n const [selectedRows, setSelectedRows] = useState<number[]>([]);\n const [sortColumn, setSortColumn] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n const sortedData = useMemo(() => {\n if (!sortColumn) return employees;\n return [...employees].sort((a, b) => {\n const aVal = a[sortColumn as keyof Employee];\n const bVal = b[sortColumn as keyof Employee];\n const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n return sortDirection === 'asc' ? cmp : -cmp;\n });\n }, [employees, sortColumn, sortDirection]);\n\n const columns: Column<Employee>[] = [\n { key: 'name', header: 'Name', width: 200, sortable: true },\n { key: 'department', header: 'Department', width: 150, sortable: true },\n {\n key: 'salary',\n header: 'Salary',\n width: 120,\n align: 'right',\n sortable: true,\n render: (value) => \\`$\\${value.toLocaleString()}\\`,\n },\n ];\n\n return (\n <View gap=\"md\">\n <DataGrid\n data={sortedData}\n columns={columns}\n rowHeight={48}\n headerHeight={52}\n virtualized\n height={400}\n stickyHeader\n selectedRows={selectedRows}\n onSelectionChange={setSelectedRows}\n multiSelect\n onSort={(col, dir) => {\n setSortColumn(col.key);\n setSortDirection(dir);\n }}\n onRowClick={(row) => console.log('Clicked:', row.name)}\n />\n <Text>{selectedRows.length} rows selected</Text>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Cell Rendering\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text, Badge, Avatar } from '@idealyst/components';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface User {\n id: number;\n name: string;\n avatar: string;\n status: 'active' | 'inactive';\n lastSeen: string;\n}\n\nconst columns: Column<User>[] = [\n {\n key: 'name',\n header: 'User',\n width: 250,\n render: (_, row) => (\n <View style={{ flexDirection: 'row', alignItems: 'center' }} gap=\"sm\">\n <Avatar src={row.avatar} size=\"sm\" fallback={row.name.charAt(0)} />\n <Text>{row.name}</Text>\n </View>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n width: 120,\n render: (value) => (\n <Badge\n type={value === 'active' ? 'filled' : 'outlined'}\n intent={value === 'active' ? 'success' : 'secondary'}\n >\n {value}\n </Badge>\n ),\n },\n { key: 'lastSeen', header: 'Last Seen', width: 180 },\n];\n\\`\\`\\`\n\n## Resizable Columns\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\nfunction ResizableGrid({ data }: { data: any[] }) {\n const [columns, setColumns] = useState<Column[]>([\n { key: 'col1', header: 'Column 1', width: 200, resizable: true, minWidth: 100 },\n { key: 'col2', header: 'Column 2', width: 300, resizable: true, minWidth: 150 },\n { key: 'col3', header: 'Column 3', width: 200, resizable: true },\n ]);\n\n const handleResize = (columnKey: string, width: number) => {\n setColumns(prev =>\n prev.map(col => (col.key === columnKey ? { ...col, width } : col))\n );\n };\n\n return (\n <DataGrid\n data={data}\n columns={columns}\n onColumnResize={handleResize}\n columnResizeMode=\"live\"\n />\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * DatePicker Package Guides\n *\n * Comprehensive documentation for @idealyst/datepicker.\n */\n\nexport const datepickerGuides: Record<string, string> = {\n \"idealyst://datepicker/overview\": `# @idealyst/datepicker\n\nCross-platform date and time picker components.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/datepicker\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Custom calendar/time UI |\n| iOS | ✅ Native DatePicker |\n| Android | ✅ Material DatePicker |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n DatePicker, // Calendar date picker\n TimePicker, // Time picker\n DateInput, // Date text input with picker\n TimeInput, // Time text input with picker\n DateTimePicker, // Combined date + time picker\n} from '@idealyst/datepicker';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { DatePicker } from '@idealyst/datepicker';\n\nfunction DateSelection() {\n const [date, setDate] = useState<Date>(new Date());\n return (\n <View padding=\"md\">\n <DatePicker value={date} onChange={setDate} />\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datepicker/api\": `# @idealyst/datepicker — API Reference\n\n## Components\n\n### DatePicker\n\nCalendar-style date picker.\n\n\\`\\`\\`typescript\ninterface DatePickerProps {\n value?: Date;\n onChange: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### TimePicker\n\nTime-only picker with 12h/24h support.\n\n\\`\\`\\`typescript\ninterface TimePickerProps {\n value?: Date;\n onChange: (date: Date) => void;\n mode?: '12h' | '24h'; // Default: '12h'\n minuteStep?: number; // Minute interval (default: 1)\n disabled?: boolean;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### DateInput\n\nText input that opens a date picker on focus/press.\n\n\\`\\`\\`typescript\ninterface DateInputProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n placeholder?: string;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n error?: string;\n size?: Size; // From @idealyst/theme\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### TimeInput\n\nText input that opens a time picker on focus/press.\n\n\\`\\`\\`typescript\ninterface TimeInputProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n placeholder?: string;\n mode?: '12h' | '24h';\n minuteStep?: number;\n disabled?: boolean;\n error?: string;\n size?: Size;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### DateTimePicker\n\nCombined date and time picker.\n\n\\`\\`\\`typescript\ninterface DateTimePickerProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n minDate?: Date;\n maxDate?: Date;\n timeMode?: '12h' | '24h';\n minuteStep?: number;\n disabled?: boolean;\n error?: string;\n size?: Size;\n style?: ViewStyle;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datepicker/examples\": `# @idealyst/datepicker — Examples\n\n## Date Input with Validation\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text, Button } from '@idealyst/components';\nimport { DateInput } from '@idealyst/datepicker';\n\nfunction BirthdayForm() {\n const [birthday, setBirthday] = useState<Date | null>(null);\n const [error, setError] = useState<string | undefined>();\n\n const handleChange = (date: Date | null) => {\n setBirthday(date);\n if (date && date > new Date()) {\n setError('Birthday cannot be in the future');\n } else {\n setError(undefined);\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateInput\n value={birthday ?? undefined}\n onChange={handleChange}\n label=\"Birthday\"\n placeholder=\"Select your birthday\"\n maxDate={new Date()}\n error={error}\n size=\"md\"\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Time Picker (24h)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { TimePicker } from '@idealyst/datepicker';\n\nfunction MeetingTimePicker() {\n const [time, setTime] = useState(new Date());\n\n return (\n <View padding=\"md\">\n <TimePicker\n value={time}\n onChange={setTime}\n mode=\"24h\"\n minuteStep={15}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Date + Time Combined\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { DateTimePicker } from '@idealyst/datepicker';\n\nfunction EventScheduler() {\n const [eventDate, setEventDate] = useState<Date | null>(null);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateTimePicker\n value={eventDate ?? undefined}\n onChange={setEventDate}\n label=\"Event Date & Time\"\n minDate={new Date()}\n timeMode=\"12h\"\n minuteStep={15}\n size=\"md\"\n />\n {eventDate && (\n <Text>Scheduled for: {eventDate.toLocaleString()}</Text>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Date Range (Two Pickers)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { DateInput } from '@idealyst/datepicker';\n\nfunction DateRangePicker() {\n const [startDate, setStartDate] = useState<Date | null>(null);\n const [endDate, setEndDate] = useState<Date | null>(null);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateInput\n value={startDate ?? undefined}\n onChange={setStartDate}\n label=\"Start Date\"\n placeholder=\"Select start date\"\n />\n <DateInput\n value={endDate ?? undefined}\n onChange={setEndDate}\n label=\"End Date\"\n placeholder=\"Select end date\"\n minDate={startDate ?? undefined}\n error={endDate && startDate && endDate < startDate ? 'End must be after start' : undefined}\n />\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Lottie Package Guides\n *\n * Comprehensive documentation for @idealyst/lottie.\n */\n\nexport const lottieGuides: Record<string, string> = {\n \"idealyst://lottie/overview\": `# @idealyst/lottie\n\nCross-platform Lottie animation component for rendering After Effects animations.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/lottie\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ lottie-web |\n| iOS | ✅ lottie-ios |\n| Android | ✅ lottie-android |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { Lottie } from '@idealyst/lottie';\nimport type { LottieProps, LottieRef, LottieSource } from '@idealyst/lottie';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { Lottie } from '@idealyst/lottie';\n\nfunction LoadingAnimation() {\n return (\n <Lottie\n source=\"https://assets.lottiefiles.com/packages/lf20_loading.json\"\n autoPlay\n loop\n style={{ width: 200, height: 200 }}\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://lottie/api\": `# @idealyst/lottie — API Reference\n\n## Lottie Component\n\n### LottieProps\n\n\\`\\`\\`typescript\ninterface LottieProps {\n /**\n * Animation source:\n * - URL string to .json file\n * - Imported JSON object\n * - require() statement (native only)\n * - { uri: string } object\n */\n source: LottieSource;\n\n /** Auto-play on mount (default: true) */\n autoPlay?: boolean;\n\n /** Loop: true = infinite, false = once, number = N times (default: false) */\n loop?: boolean | number;\n\n /** Playback speed: 1 = normal, 2 = double, 0.5 = half (default: 1) */\n speed?: number;\n\n /** Container style */\n style?: ViewStyle;\n\n /** Resize mode (default: 'contain') */\n resizeMode?: 'cover' | 'contain' | 'center';\n\n /** Initial progress 0-1 */\n progress?: number;\n\n /** Callback when animation completes a loop or finishes */\n onComplete?: () => void;\n\n /** Callback when animation is loaded */\n onLoad?: () => void;\n\n /** Callback on load error */\n onError?: (error: Error) => void;\n\n /** Frame update callback */\n onAnimationUpdate?: (frame: number) => void;\n\n /** Conditional rendering (default: true) */\n visible?: boolean;\n\n testID?: string;\n}\n\\`\\`\\`\n\n### LottieSource Type\n\n\\`\\`\\`typescript\ntype LottieSource = string | LottieJSON | { uri: string };\n\\`\\`\\`\n\n---\n\n### LottieRef (imperative methods)\n\nAccess via \\`useRef<LottieRef>(null)\\` and \\`ref\\` prop. **Note:** In React 19, \\`useRef\\` requires an initial argument — always pass \\`null\\`.\n\n| Method | Description |\n|--------|-------------|\n| play() | Start playing from current position |\n| pause() | Pause at current position |\n| stop() | Stop and reset to beginning |\n| reset() | Reset to beginning without stopping |\n| setProgress(p) | Set progress (0-1) |\n| goToAndStop(frame, isFrame?) | Go to frame/time and stop |\n| goToAndPlay(frame, isFrame?) | Go to frame/time and play |\n| setSpeed(speed) | Set playback speed |\n| setDirection(dir) | Set direction: 1 (forward) or -1 (reverse) |\n| playSegments(start, end, force?) | Play specific frame range |\n| getCurrentFrame() | Get current frame number |\n| getTotalFrames() | Get total frames |\n| getDuration() | Get duration in seconds |\n| isPlaying() | Check if playing |\n| destroy() | Clean up resources |\n`,\n\n \"idealyst://lottie/examples\": `# @idealyst/lottie — Examples\n\n## Basic Animation\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\n\nfunction SuccessAnimation() {\n return (\n <View style={{ alignItems: 'center' }} padding=\"lg\">\n <Lottie\n source=\"https://assets.lottiefiles.com/packages/lf20_success.json\"\n autoPlay\n loop={false}\n style={{ width: 150, height: 150 }}\n onComplete={() => console.log('Animation done')}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Imported JSON\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Lottie } from '@idealyst/lottie';\nimport loadingAnimation from '../assets/loading.json';\n\nfunction LoadingSpinner() {\n return (\n <Lottie\n source={loadingAnimation}\n autoPlay\n loop\n speed={1.5}\n style={{ width: 100, height: 100 }}\n />\n );\n}\n\\`\\`\\`\n\n## Controlled with Ref\n\n\\`\\`\\`tsx\nimport React, { useRef } from 'react';\nimport { View, Button } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\nimport type { LottieRef } from '@idealyst/lottie';\n\nfunction ControlledAnimation() {\n const lottieRef = useRef<LottieRef>(null);\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ alignItems: 'center' }}>\n <Lottie\n ref={lottieRef}\n source=\"https://assets.lottiefiles.com/packages/lf20_animation.json\"\n autoPlay={false}\n loop\n style={{ width: 200, height: 200 }}\n />\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => lottieRef.current?.play()} size=\"sm\">Play</Button>\n <Button onPress={() => lottieRef.current?.pause()} size=\"sm\">Pause</Button>\n <Button onPress={() => lottieRef.current?.stop()} size=\"sm\">Stop</Button>\n </View>\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button\n onPress={() => lottieRef.current?.setSpeed(2)}\n size=\"sm\"\n intent=\"secondary\"\n >\n 2x Speed\n </Button>\n <Button\n onPress={() => lottieRef.current?.setDirection(-1)}\n size=\"sm\"\n intent=\"secondary\"\n >\n Reverse\n </Button>\n <Button\n onPress={() => lottieRef.current?.playSegments(0, 30)}\n size=\"sm\"\n intent=\"secondary\"\n >\n First 30 Frames\n </Button>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Progress-Based (Scroll-Linked)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\n\nfunction ScrollLinkedAnimation() {\n const [progress, setProgress] = useState(0);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Lottie\n source=\"https://example.com/scroll-animation.json\"\n autoPlay={false}\n progress={progress}\n style={{ width: 300, height: 200 }}\n />\n {/* Slider to simulate scroll progress */}\n <View style={{ flexDirection: 'row', alignItems: 'center' }} gap=\"sm\">\n <Text>0%</Text>\n <input\n type=\"range\"\n min={0}\n max={100}\n value={progress * 100}\n onChange={(e) => setProgress(Number(e.target.value) / 100)}\n style={{ flex: 1 }}\n />\n <Text>100%</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Markdown Package Guides\n *\n * Comprehensive documentation for @idealyst/markdown.\n */\n\nexport const markdownGuides: Record<string, string> = {\n \"idealyst://markdown/overview\": `# @idealyst/markdown\n\nCross-platform Markdown renderer with theme integration, syntax highlighting, and GFM support.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/markdown\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ react-markdown |\n| iOS | ✅ react-native-markdown-display |\n| Android | ✅ react-native-markdown-display |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { Markdown } from '@idealyst/markdown';\nimport type { MarkdownProps, MarkdownStyleOverrides } from '@idealyst/markdown';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { Markdown } from '@idealyst/markdown';\n\nfunction MarkdownContent() {\n return (\n <Markdown>\n {\\`# Hello World\n\nThis is **bold** and *italic* text.\n\n- List item 1\n- List item 2\n\n\\\\\\`\\\\\\`\\\\\\`javascript\nconst x = 42;\n\\\\\\`\\\\\\`\\\\\\`\n\\`}\n </Markdown>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://markdown/api\": `# @idealyst/markdown — API Reference\n\n## Markdown Component\n\n### MarkdownProps\n\n\\`\\`\\`typescript\ninterface MarkdownProps {\n /** Markdown content string */\n children: string;\n\n /** Text size variant (default: 'md') */\n size?: Size;\n\n /** Link color intent (default: 'primary') */\n linkIntent?: Intent;\n\n /** Custom style overrides for specific elements */\n styleOverrides?: MarkdownStyleOverrides;\n\n /** Link handling configuration */\n linkHandler?: LinkHandler;\n\n /** Image handling configuration */\n imageHandler?: ImageHandler;\n\n /** Code block configuration */\n codeOptions?: CodeBlockOptions;\n\n /** Enable GFM extensions: tables, strikethrough, task lists, footnotes (default: true) */\n gfm?: boolean;\n\n /** Allow raw HTML in markdown (default: false) */\n allowHtml?: boolean;\n\n /** Custom component renderers (advanced) */\n components?: Partial<Record<MarkdownElementType, ComponentType<any>>>;\n\n /** Container style */\n style?: StyleProp<ViewStyle>;\n\n testID?: string;\n accessibilityLabel?: string;\n}\n\\`\\`\\`\n\n---\n\n### Style Types\n\n\\`\\`\\`typescript\ntype MarkdownElementType =\n | 'body' | 'heading1' | 'heading2' | 'heading3' | 'heading4' | 'heading5' | 'heading6'\n | 'paragraph' | 'strong' | 'em' | 'strikethrough'\n | 'link' | 'blockquote'\n | 'codeInline' | 'codeBlock'\n | 'listOrdered' | 'listUnordered' | 'listItem'\n | 'table' | 'tableHead' | 'tableRow' | 'tableCell'\n | 'image' | 'hr' | 'taskListItem' | 'footnote' | 'footnoteRef';\n\ntype MarkdownStyleOverrides = Partial<Record<MarkdownElementType, StyleProp<ViewStyle | TextStyle>>>;\n\\`\\`\\`\n\n---\n\n### LinkHandler\n\n\\`\\`\\`typescript\ninterface LinkHandler {\n /** Called when link is pressed. Return true to prevent default. */\n onLinkPress?: (url: string, title?: string) => boolean | void;\n\n /** Open external links in browser (default: true) */\n openExternalLinks?: boolean;\n}\n\\`\\`\\`\n\n### ImageHandler\n\n\\`\\`\\`typescript\ninterface ImageHandler {\n /** Custom image URL resolver for relative paths */\n resolveImageUrl?: (src: string) => string;\n\n /** Default image dimensions when not specified */\n defaultImageDimensions?: { width?: number; height?: number };\n\n /** Called when image is pressed */\n onImagePress?: (src: string, alt?: string) => void;\n}\n\\`\\`\\`\n\n### CodeBlockOptions\n\n\\`\\`\\`typescript\ninterface CodeBlockOptions {\n /** Enable syntax highlighting (default: false) */\n syntaxHighlighting?: boolean;\n\n /** Syntax theme: 'auto' | 'light' | 'dark' (default: 'auto') */\n syntaxTheme?: 'auto' | 'light' | 'dark';\n\n /** Show line numbers (default: false) */\n showLineNumbers?: boolean;\n\n /** Show copy button — web only (default: true) */\n copyButton?: boolean;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://markdown/examples\": `# @idealyst/markdown — Examples\n\n## Basic Rendering\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View } from '@idealyst/components';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction ArticleView({ content }: { content: string }) {\n return (\n <View padding=\"md\">\n <Markdown size=\"md\" gfm>\n {content}\n </Markdown>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Link Handling\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\nimport { useNavigator } from '@idealyst/navigation';\n\nfunction DocumentView({ markdown }: { markdown: string }) {\n const { navigate } = useNavigator();\n\n return (\n <Markdown\n linkHandler={{\n onLinkPress: (url) => {\n if (url.startsWith('/')) {\n navigate({ path: url });\n return true; // Prevent default browser behavior\n }\n return false; // Allow external links to open normally\n },\n openExternalLinks: true,\n }}\n >\n {markdown}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## With Syntax Highlighting\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction CodeDocumentation({ content }: { content: string }) {\n return (\n <Markdown\n codeOptions={{\n syntaxHighlighting: true,\n syntaxTheme: 'auto',\n showLineNumbers: true,\n copyButton: true,\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## Custom Style Overrides\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction StyledMarkdown({ content }: { content: string }) {\n return (\n <Markdown\n styleOverrides={{\n heading1: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 },\n heading2: { fontSize: 22, fontWeight: '600', marginBottom: 12 },\n blockquote: {\n borderLeftWidth: 4,\n borderLeftColor: '#4CAF50',\n paddingLeft: 16,\n fontStyle: 'italic',\n },\n codeBlock: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n padding: 16,\n },\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## Image Handling\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction WikiArticle({ content, baseUrl }: { content: string; baseUrl: string }) {\n return (\n <Markdown\n imageHandler={{\n resolveImageUrl: (src) => {\n if (src.startsWith('http')) return src;\n return baseUrl + '/images/' + src;\n },\n defaultImageDimensions: { width: 300 },\n onImagePress: (src, alt) => console.log('Image clicked:', src),\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Config Package Guides\n *\n * Comprehensive documentation for @idealyst/config.\n */\n\nexport const configGuides: Record<string, string> = {\n \"idealyst://config/overview\": `# @idealyst/config\n\nCross-platform environment variable management. Reads from \\`.env\\` files (native) and \\`import.meta.env\\` (web/Vite) with a unified API.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/config\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Vite import.meta.env (strips VITE_ prefix) |\n| iOS | ✅ react-native-config |\n| Android | ✅ react-native-config |\n| Node | ✅ dotenv |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { config } from '@idealyst/config';\nimport type { IConfig, ConfigValidationError, ConfigKeys } from '@idealyst/config';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\n// Get a value (returns undefined if not set)\nconst apiUrl = config.get('API_URL');\n\n// Get a required value (throws if not set)\nconst secretKey = config.getRequired('SECRET_KEY');\n\n// Check existence\nif (config.has('FEATURE_FLAG')) {\n // ...\n}\n\n// Validate required keys on app startup\nconfig.validate(['API_URL', 'AUTH_URL', 'APP_NAME']);\n\\`\\`\\`\n`,\n\n \"idealyst://config/api\": `# @idealyst/config — API Reference\n\n## config (singleton)\n\nThe default \\`config\\` instance reads from the platform-appropriate source.\n\n### IConfig Interface\n\n\\`\\`\\`typescript\ninterface IConfig {\n /**\n * Get a configuration value by key.\n * Keys are canonical (without VITE_ prefix on web).\n * @returns The value, or defaultValue, or undefined\n */\n get(key: string, defaultValue?: string): string | undefined;\n\n /**\n * Get a required configuration value.\n * @throws Error if key is not defined\n */\n getRequired(key: string): string;\n\n /**\n * Check if a configuration key exists.\n */\n has(key: string): boolean;\n\n /**\n * Get all available configuration keys.\n */\n keys(): string[];\n\n /**\n * Validate that all required keys are present.\n * @throws ConfigValidationError if any keys are missing\n */\n validate(requiredKeys: string[]): void;\n}\n\\`\\`\\`\n\n### ConfigValidationError\n\n\\`\\`\\`typescript\nclass ConfigValidationError extends Error {\n readonly missingKeys: string[];\n}\n\\`\\`\\`\n\nThrown by \\`config.validate()\\` when required keys are missing.\n\n---\n\n## Key Naming\n\n| Platform | Env var | config.get() key |\n|----------|---------|------------------|\n| Web (Vite) | \\`VITE_API_URL\\` | \\`'API_URL'\\` |\n| Native | \\`API_URL\\` | \\`'API_URL'\\` |\n| Node | \\`API_URL\\` | \\`'API_URL'\\` |\n\nThe \\`VITE_\\` prefix is automatically stripped on web.\n\n---\n\n## Type Augmentation\n\nRun \\`idealyst-config generate\\` to augment the \\`ConfigKeys\\` interface with your actual env vars for autocomplete:\n\n\\`\\`\\`typescript\n// Generated by idealyst-config generate:\ndeclare module '@idealyst/config' {\n interface ConfigKeys {\n API_URL: string;\n AUTH_URL: string;\n APP_NAME: string;\n }\n}\n\\`\\`\\`\n`,\n\n \"idealyst://config/examples\": `# @idealyst/config — Examples\n\n## App Initialization\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\n// Validate required config at app startup\nfunction initializeApp() {\n try {\n config.validate(['API_URL', 'AUTH_URL', 'APP_NAME']);\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n console.error('Missing config keys:', error.missingKeys);\n throw error;\n }\n }\n\n return {\n apiUrl: config.getRequired('API_URL'),\n authUrl: config.getRequired('AUTH_URL'),\n appName: config.getRequired('APP_NAME'),\n debugMode: config.get('DEBUG') === 'true',\n };\n}\n\\`\\`\\`\n\n## API Client Setup\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\nconst apiClient = {\n baseUrl: config.getRequired('API_URL'),\n timeout: parseInt(config.get('API_TIMEOUT', '30000') ?? '30000', 10),\n\n async fetch(path: string, options?: RequestInit) {\n const response = await fetch(\\`\\${this.baseUrl}\\${path}\\`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n return response.json();\n },\n};\n\\`\\`\\`\n\n## Feature Flags\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\nconst features = {\n newDashboard: config.get('FEATURE_NEW_DASHBOARD') === 'true',\n darkMode: config.get('FEATURE_DARK_MODE', 'true') === 'true',\n analytics: config.has('ANALYTICS_KEY'),\n};\n\nfunction AppRouter() {\n return features.newDashboard ? <NewDashboard /> : <LegacyDashboard />;\n}\n\\`\\`\\`\n\n## OAuth Configuration\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/google',\n redirectUrl: config.getRequired('OAUTH_REDIRECT_URL'),\n});\n\\`\\`\\`\n`,\n};\n","/**\n * Charts Package Guides\n *\n * Comprehensive documentation for @idealyst/charts.\n */\n\nexport const chartsGuides: Record<string, string> = {\n \"idealyst://charts/overview\": `# @idealyst/charts\n\nCross-platform animated charting library with SVG and Skia renderers.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/charts\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Renderer |\n|----------|----------|\n| Web | SVG |\n| iOS | Skia (via react-native-skia) or SVG |\n| Android | Skia (via react-native-skia) or SVG |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n LineChart,\n BarChart,\n // More chart types available\n} from '@idealyst/charts';\nimport type {\n DataPoint,\n ChartDataSeries,\n Column,\n BaseChartProps,\n CartesianChartProps,\n LineChartProps,\n BarChartProps,\n} from '@idealyst/charts';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { LineChart } from '@idealyst/charts';\n\nconst data = [\n { x: 'Jan', y: 30 },\n { x: 'Feb', y: 45 },\n { x: 'Mar', y: 28 },\n { x: 'Apr', y: 65 },\n { x: 'May', y: 42 },\n];\n\nfunction SalesChart() {\n return (\n <LineChart\n data={[{ id: 'sales', name: 'Sales', data }]}\n height={300}\n animate\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://charts/api\": `# @idealyst/charts — API Reference\n\n## Data Types\n\n### DataPoint\n\n\\`\\`\\`typescript\ninterface DataPoint {\n x: string | number | Date;\n y: number;\n label?: string; // Optional label for THIS individual point\n color?: string;\n metadata?: Record<string, unknown>;\n}\n\\`\\`\\`\n\n### ChartDataSeries\n\nA series is a named collection of data points. It has EXACTLY these properties:\n\n\\`\\`\\`typescript\ninterface ChartDataSeries {\n id: string; // REQUIRED — Unique identifier for this series\n name: string; // REQUIRED — Display name (shown in legend/tooltip)\n data: DataPoint[]; // REQUIRED — Array of data points\n color?: string; // Optional — Custom color for this series\n intent?: Intent; // Optional — Theme intent for automatic coloring\n visible?: boolean; // Optional — Whether this series is visible\n}\n\\`\\`\\`\n\n> **WARNING:** \\`ChartDataSeries\\` has NO \\`label\\` property. Use \\`name\\` for the series display name. Only \\`DataPoint\\` has \\`label\\` (for individual point labels). Adding \\`label\\` to a series object will cause a TypeScript error (TS2353: excess property check).\n\n### PieDataPoint\n\n\\`\\`\\`typescript\ninterface PieDataPoint {\n value: number;\n label: string;\n color?: string;\n}\n\\`\\`\\`\n\n---\n\n## Base Props (shared by all charts)\n\n### BaseChartProps\n\n\\`\\`\\`typescript\ninterface BaseChartProps {\n data: ChartDataSeries[] | ChartDataSeries;\n height?: number | string;\n width?: number | string;\n padding?: Partial<ChartPadding> | number;\n animate?: boolean; // NOTE: 'animate' — NOT 'animated'\n animationDuration?: number;\n animationDelay?: number;\n intent?: Intent;\n showLegend?: boolean;\n legendPosition?: 'top' | 'bottom' | 'left' | 'right';\n interactive?: boolean;\n showTooltip?: boolean;\n}\n\\`\\`\\`\n\n> **IMPORTANT:** The prop is \\`animate\\` — NOT \\`animated\\`. Using \\`animated\\` will cause a TS error.\n\n### CartesianChartProps (extends BaseChartProps)\n\nFor charts with X/Y axes (Line, Bar, etc.):\n\n\\`\\`\\`typescript\ninterface CartesianChartProps extends BaseChartProps {\n xAxis?: AxisConfig;\n yAxis?: AxisConfig;\n showXAxis?: boolean; // Shorthand for xAxis.show\n showYAxis?: boolean; // Shorthand for yAxis.show\n showGrid?: boolean; // Shorthand for grid lines\n}\n\\`\\`\\`\n\n### AxisConfig\n\n\\`\\`\\`typescript\ninterface AxisConfig {\n show?: boolean; // Use 'show' — NOT 'visible'\n label?: string; // Axis label text\n tickCount?: number; // Number of ticks to show\n tickFormat?: (value: number | string | Date) => string; // Custom tick formatter\n gridLines?: boolean; // Whether to show grid lines\n min?: number; // Minimum value (auto if not set)\n max?: number; // Maximum value (auto if not set)\n}\n\\`\\`\\`\n\n> **Common mistakes:**\n> - Use \\`show\\` — NOT \\`visible\\`. \\`{ visible: true }\\` will cause a TS error.\n> - \\`tickFormat\\` parameter is \\`number | string | Date\\` — NOT just \\`number\\`. Example:\n> \\`\\`\\`typescript\n> tickFormat: (value: number | string | Date) => \\`$\\${Number(value) / 1000}k\\`\n> \\`\\`\\`\n\n---\n\n## Chart Components\n\n### LineChart\n\n\\`\\`\\`typescript\ninterface LineChartProps extends CartesianChartProps {\n curve?: CurveType; // 'linear' | 'monotone' | 'cardinal' | 'step' | ...\n strokeWidth?: number;\n showDots?: boolean;\n dotRadius?: number; // NOTE: 'dotRadius' — NOT 'dotSize'\n showArea?: boolean; // NOTE: 'showArea' — NOT 'area'\n areaOpacity?: number;\n}\n\\`\\`\\`\n\n> **Common mistakes:** Use \\`showArea\\` (NOT \\`area\\`), \\`dotRadius\\` (NOT \\`dotSize\\`), \\`animate\\` (NOT \\`animated\\`).\n\n### BarChart\n\n\\`\\`\\`typescript\ninterface BarChartProps extends CartesianChartProps {\n orientation?: 'vertical' | 'horizontal';\n grouped?: boolean; // Side-by-side bars for multiple series\n stacked?: boolean; // Stacked bars for multiple series\n barRadius?: number; // NOTE: 'barRadius' — NOT 'borderRadius'\n barPadding?: number; // Padding between bars (0-1)\n groupPadding?: number; // Padding between bar groups (0-1)\n}\n\\`\\`\\`\n\n> **Common mistakes:** Use \\`barRadius\\` (NOT \\`borderRadius\\`), \\`barPadding\\` (NOT \\`gap\\` or \\`barWidth\\`).\n\n---\n\n## Scales\n\n\\`\\`\\`typescript\n// Linear scale for numeric data\ninterface LinearScaleConfig { domain?: [number, number]; nice?: boolean; }\n\n// Band scale for categorical data\ninterface BandScaleConfig { padding?: number; align?: number; }\n\n// Time scale for date data\ninterface TimeScaleConfig { domain?: [Date, Date]; }\n\\`\\`\\`\n\n## Curve Types\n\n\\`\\`\\`typescript\ntype CurveType =\n | 'linear' // Straight lines between points\n | 'monotone' // Smooth curve preserving monotonicity\n | 'cardinal' // Cardinal spline\n | 'step' // Step function\n | 'stepBefore' // Step before each point\n | 'stepAfter' // Step after each point\n | 'basis' // B-spline\n | 'natural'; // Natural cubic spline\n\\`\\`\\`\n`,\n\n \"idealyst://charts/examples\": `# @idealyst/charts — Examples\n\n> **Before writing chart code, remember these rules:**\n> - Series uses \\`name\\` (NOT \\`label\\`). Adding \\`label\\` to \\`ChartDataSeries\\` causes TS2353.\n> - Use \\`animate\\` (NOT \\`animated\\`), \\`showArea\\` (NOT \\`area\\`), \\`dotRadius\\` (NOT \\`dotSize\\`), \\`barRadius\\` (NOT \\`borderRadius\\`).\n> - \\`tickFormat\\` signature is \\`(value: number | string | Date) => string\\` — NOT \\`(v: number) => string\\`.\n> - \\`AxisConfig\\` uses \\`show\\` (NOT \\`visible\\`) to control axis visibility.\n\n## Line Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { LineChart } from '@idealyst/charts';\nimport type { ChartDataSeries } from '@idealyst/charts';\n\nconst monthlySales = [\n { x: 'Jan', y: 4200 },\n { x: 'Feb', y: 5100 },\n { x: 'Mar', y: 4800 },\n { x: 'Apr', y: 6200 },\n { x: 'May', y: 5900 },\n { x: 'Jun', y: 7100 },\n];\n\n// Series uses 'name' for display — NOT 'label'\nconst revenueData: ChartDataSeries[] = [\n { id: 'revenue', name: 'Revenue', data: monthlySales, color: '#4CAF50' },\n];\n\nfunction SalesOverview() {\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Monthly Sales</Text>\n <LineChart\n data={revenueData}\n height={300}\n curve=\"monotone\"\n showDots\n showArea\n areaOpacity={0.15}\n animate\n xAxis={{ label: 'Month' }}\n yAxis={{\n label: 'Revenue ($)',\n // tickFormat param type is (value: number | string | Date) => string\n tickFormat: (value: number | string | Date) => \\`$\\${Number(value) / 1000}k\\`,\n }}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Multi-Series Line Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { LineChart } from '@idealyst/charts';\nimport type { ChartDataSeries } from '@idealyst/charts';\n\n// Each series has: id, name, data, color? — NO 'label' property\nconst series: ChartDataSeries[] = [\n {\n id: 'product-a',\n name: 'Product A', // Use 'name' — NOT 'label'\n data: [\n { x: 'Q1', y: 120 },\n { x: 'Q2', y: 150 },\n { x: 'Q3', y: 180 },\n { x: 'Q4', y: 210 },\n ],\n color: '#2196F3',\n },\n {\n id: 'product-b',\n name: 'Product B', // Use 'name' — NOT 'label'\n data: [\n { x: 'Q1', y: 80 },\n { x: 'Q2', y: 110 },\n { x: 'Q3', y: 95 },\n { x: 'Q4', y: 140 },\n ],\n color: '#FF9800',\n },\n];\n\nfunction ComparisonChart() {\n return (\n <LineChart\n data={series}\n height={350}\n curve=\"monotone\"\n showDots\n animate\n />\n );\n}\n\\`\\`\\`\n\n## Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { BarChart } from '@idealyst/charts';\n\nconst categories = [\n { x: 'Electronics', y: 45 },\n { x: 'Clothing', y: 32 },\n { x: 'Books', y: 18 },\n { x: 'Food', y: 56 },\n { x: 'Sports', y: 28 },\n];\n\nfunction CategoryBreakdown() {\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Sales by Category</Text>\n <BarChart\n data={[{ id: 'units', name: 'Units Sold', data: categories }]}\n height={300}\n barRadius={4}\n animate\n yAxis={{ tickFormat: (value: number | string | Date) => \\`\\${value} units\\` }}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Stacked Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { BarChart } from '@idealyst/charts';\n\nfunction StackedBarExample() {\n return (\n <BarChart\n data={[\n {\n id: 'online',\n name: 'Online',\n data: [\n { x: 'Q1', y: 100 },\n { x: 'Q2', y: 120 },\n { x: 'Q3', y: 90 },\n ],\n color: '#4CAF50',\n },\n {\n id: 'in-store',\n name: 'In-Store',\n data: [\n { x: 'Q1', y: 60 },\n { x: 'Q2', y: 80 },\n { x: 'Q3', y: 70 },\n ],\n color: '#2196F3',\n },\n ]}\n height={300}\n stacked\n animate\n />\n );\n}\n\\`\\`\\`\n\n## Horizontal Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { BarChart } from '@idealyst/charts';\n\nfunction HorizontalBarExample() {\n const data = [\n { x: 'React', y: 85 },\n { x: 'Vue', y: 62 },\n { x: 'Angular', y: 45 },\n { x: 'Svelte', y: 38 },\n ];\n\n return (\n <BarChart\n data={[{ id: 'popularity', name: 'Popularity', data }]}\n height={250}\n orientation=\"horizontal\"\n animate\n />\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Installation Guides for Idealyst Packages\n *\n * Provides detailed installation instructions including:\n * - npm/yarn installation commands\n * - iOS configuration (Info.plist, CocoaPods)\n * - Android configuration (AndroidManifest.xml, Gradle)\n * - Additional dependencies and peer dependencies\n */\n\nexport interface InstallGuide {\n packageName: string;\n npmName: string;\n description: string;\n platforms: (\"web\" | \"native\" | \"node\")[];\n complexity: \"simple\" | \"moderate\" | \"complex\";\n\n // Basic installation\n installation: {\n yarn: string;\n npm: string;\n };\n\n // Peer dependencies to install\n peerDependencies?: {\n name: string;\n required: boolean;\n platforms: (\"web\" | \"native\")[];\n note?: string;\n }[];\n\n // iOS-specific configuration\n ios?: {\n podInstallRequired: boolean;\n infoPlistEntries?: {\n key: string;\n value: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Android-specific configuration\n android?: {\n permissions?: {\n permission: string;\n description: string;\n }[];\n manifestEntries?: {\n location: string;\n xml: string;\n description: string;\n }[];\n gradleChanges?: {\n file: string;\n changes: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Web-specific configuration\n web?: {\n additionalDependencies?: string[];\n bundlerConfig?: string;\n notes?: string[];\n };\n\n // Post-installation verification\n verification?: string;\n\n // Common issues and solutions\n troubleshooting?: {\n issue: string;\n solution: string;\n }[];\n}\n\nexport const installGuides: Record<string, InstallGuide> = {\n // ============================================================================\n // CORE PACKAGES\n // ============================================================================\n\n theme: {\n packageName: \"Theme\",\n npmName: \"@idealyst/theme\",\n description: \"Cross-platform theming system built on react-native-unistyles\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/theme react-native-unistyles\",\n npm: \"npm install @idealyst/theme react-native-unistyles\",\n },\n peerDependencies: [\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for styling system\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required - auto-linked by React Native\",\n ],\n },\n verification: `import { UnistylesProvider } from '@idealyst/theme';\n// Wrap your app with UnistylesProvider`,\n },\n\n components: {\n packageName: \"Components\",\n npmName: \"@idealyst/components\",\n description: \"Cross-platform React UI components for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-reanimated\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated components\",\n },\n {\n name: \"react-native-safe-area-context\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for Screen component\",\n },\n {\n name: \"react-native-vector-icons\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for icons on native\",\n },\n {\n name: \"@mdi/react @mdi/js\",\n required: false,\n platforms: [\"web\"],\n note: \"Required for icons on web\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"If using vector icons, add fonts to Info.plist\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required for base components\",\n \"If using vector icons, follow react-native-vector-icons setup\",\n ],\n },\n web: {\n additionalDependencies: [\"@mdi/react\", \"@mdi/js\"],\n notes: [\n \"Icons use @mdi/react on web instead of vector-icons\",\n \"Ensure your bundler supports .web.tsx and .native.tsx extensions\",\n ],\n },\n },\n\n navigation: {\n packageName: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description: \"Unified navigation system for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/navigation\",\n npm: \"npm install @idealyst/navigation\",\n },\n peerDependencies: [\n {\n name: \"@react-navigation/native @react-navigation/stack @react-navigation/bottom-tabs\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native navigation\",\n },\n {\n name: \"react-native-screens react-native-safe-area-context\",\n required: true,\n platforms: [\"native\"],\n note: \"Required dependencies for React Navigation\",\n },\n {\n name: \"react-native-gesture-handler\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for gesture-based navigation\",\n },\n {\n name: \"react-router react-router-dom\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web routing\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n android: {\n additionalSteps: [\n \"Ensure react-native-screens is configured in MainActivity\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n web: {\n additionalDependencies: [\"react-router\", \"react-router-dom\"],\n },\n },\n\n // ============================================================================\n // MEDIA PACKAGES (Complex Native Setup)\n // ============================================================================\n\n camera: {\n packageName: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture using Vision Camera\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/camera react-native-vision-camera\",\n npm: \"npm install @idealyst/camera react-native-vision-camera\",\n },\n peerDependencies: [\n {\n name: \"react-native-vision-camera\",\n required: true,\n platforms: [\"native\"],\n note: \"Core camera functionality for React Native\",\n },\n {\n name: \"react-native-worklets-core\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for frame processors\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSCameraUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your camera\",\n description: \"Required: Camera permission description\",\n },\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone for video recording\",\n description: \"Required for video recording with audio\",\n },\n {\n key: \"NSPhotoLibraryUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your photo library to save photos\",\n description: \"Optional: Only if saving to photo library\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For advanced features, see: https://react-native-vision-camera.com/docs/guides/\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.CAMERA\",\n description: \"Required: Camera access\",\n },\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for video recording with audio\",\n },\n {\n permission: \"android.permission.WRITE_EXTERNAL_STORAGE\",\n description: \"Optional: Only if saving to external storage (API < 29)\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n\n<!-- Required for camera features -->\n<uses-feature android:name=\"android.hardware.camera\" android:required=\"false\" />\n<uses-feature android:name=\"android.hardware.camera.autofocus\" android:required=\"false\" />`,\n description: \"Camera and audio permissions\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher in android/build.gradle\",\n \"Enable Kotlin if not already enabled\",\n \"For CameraX features, ensure you have the latest camera libraries\",\n ],\n },\n web: {\n notes: [\n \"Uses native MediaDevices API (WebRTC)\",\n \"Requires HTTPS in production for camera access\",\n \"User must grant camera permission in browser\",\n ],\n },\n verification: `import { useCamera, CameraPreview, requestPermission } from '@idealyst/camera';\n\n// Request permission\nconst result = await requestPermission();\n// result.granted === true if permission was given\n\n// In a component:\nconst camera = useCamera({ autoRequestPermission: true });\n// camera.permission?.granted, camera.takePhoto(), camera.cameraRef`,\n troubleshooting: [\n {\n issue: \"Camera not showing on iOS\",\n solution:\n \"Ensure NSCameraUsageDescription is in Info.plist and rebuild the app\",\n },\n {\n issue: \"Permission denied on Android\",\n solution:\n \"Check AndroidManifest.xml has CAMERA permission and user granted it at runtime\",\n },\n {\n issue: \"Build fails with Vision Camera\",\n solution:\n \"Ensure you have the latest CocoaPods (iOS) or Gradle (Android) and clean build\",\n },\n ],\n },\n\n audio: {\n packageName: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for recording, playback, and PCM streaming using React Native Audio API\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/audio react-native-audio-api\",\n npm: \"npm install @idealyst/audio react-native-audio-api\",\n },\n peerDependencies: [\n {\n name: \"react-native-audio-api\",\n required: true,\n platforms: [\"native\"],\n note: \"Core audio API for React Native (Web Audio API polyfill)\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone to record audio\",\n description: \"Required for recording: Microphone permission description\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For background audio, add audio background mode to Info.plist\",\n \"Audio session is auto-configured for playAndRecord mode\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for recording: Microphone access\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />`,\n description: \"Microphone permission for recording\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher\",\n \"Permission must be requested at runtime on Android 6.0+\",\n \"No additional permissions required for playback only\",\n ],\n },\n web: {\n notes: [\n \"Uses Web Audio API for recording and playback\",\n \"Requires HTTPS in production for microphone access\",\n \"User must grant microphone permission in browser for recording\",\n \"No permissions required for playback only\",\n \"Supports PCM streaming for real-time TTS playback\",\n ],\n },\n verification: `import { useRecorder, usePlayer, useAudio, AUDIO_PROFILES } from '@idealyst/audio';\n\n// Initialize audio session (recommended)\nconst audio = useAudio();\n\n// Recording\nconst recorder = useRecorder({ config: AUDIO_PROFILES.speech });\nawait recorder.start();\n// ... later\nawait recorder.stop();\n\n// File playback\nconst player = usePlayer();\nawait player.loadFile('/audio/music.mp3');\nawait player.play();\n\n// PCM streaming (for TTS)\nawait player.loadPCMStream(AUDIO_PROFILES.speech);\nawait player.play();\nplayer.feedPCMData(pcmData);`,\n troubleshooting: [\n {\n issue: \"No audio data received during recording\",\n solution:\n \"Ensure microphone permission is granted and check subscribeToData callback\",\n },\n {\n issue: \"Build fails on iOS\",\n solution:\n \"Run pod install and ensure NSMicrophoneUsageDescription is set in Info.plist\",\n },\n {\n issue: \"Permission prompt not appearing on web\",\n solution: \"Ensure page is served over HTTPS (required for getUserMedia)\",\n },\n {\n issue: \"Recording and playback conflict on iOS\",\n solution:\n \"Use useAudio() hook to initialize session with playAndRecord category, or use SESSION_PRESETS.voiceChat\",\n },\n {\n issue: \"Audio cuts out when switching between recording and playback\",\n solution:\n \"Ensure audio session is configured with SESSION_PRESETS.default which enables simultaneous recording and playback\",\n },\n ],\n },\n\n // ============================================================================\n // DATA & STORAGE PACKAGES\n // ============================================================================\n\n storage: {\n packageName: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with MMKV on native and localStorage on web\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/storage react-native-mmkv\",\n npm: \"npm install @idealyst/storage react-native-mmkv\",\n },\n peerDependencies: [\n {\n name: \"react-native-mmkv\",\n required: true,\n platforms: [\"native\"],\n note: \"High-performance storage for React Native\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"MMKV requires iOS 11.0 or higher\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required\",\n \"MMKV auto-links with React Native\",\n \"Ensure minSdkVersion is 21 or higher\",\n ],\n },\n web: {\n notes: [\n \"Uses localStorage as the storage backend\",\n \"Falls back gracefully if localStorage is unavailable\",\n \"API is identical across platforms\",\n ],\n },\n verification: `import { storage } from '@idealyst/storage';\n\nawait storage.set('key', { data: 'value' });\nconst data = await storage.get('key');`,\n },\n\n datagrid: {\n packageName: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/datagrid @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/components\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-window\",\n required: true,\n platforms: [\"web\"],\n note: \"Virtualization library for web\",\n },\n ],\n web: {\n additionalDependencies: [\"react-window\"],\n notes: [\"Uses react-window for virtualized rendering on web\"],\n },\n },\n\n // ============================================================================\n // AUTH PACKAGES\n // ============================================================================\n\n \"oauth-client\": {\n packageName: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description: \"Universal OAuth2 client with PKCE support for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n npm: \"npm install @idealyst/oauth-client @idealyst/storage\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/storage\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for secure token storage\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"CFBundleURLTypes\",\n value: `<array>\n <dict>\n <key>CFBundleURLSchemes</key>\n <array>\n <string>com.yourapp</string>\n </array>\n </dict>\n</array>`,\n description: \"URL scheme for OAuth callback deep links\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Replace 'com.yourapp' with your app's bundle identifier or custom scheme\",\n \"Handle the URL in your AppDelegate or SceneDelegate\",\n ],\n },\n android: {\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <activity> for MainActivity)\",\n xml: `<intent-filter android:label=\"oauth_callback\">\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n <category android:name=\"android.intent.category.BROWSABLE\" />\n <data android:scheme=\"com.yourapp\" />\n</intent-filter>`,\n description:\n \"Deep link handler for OAuth callback. Replace 'com.yourapp' with your scheme.\",\n },\n ],\n additionalSteps: [\n \"Replace 'com.yourapp' with your app's package name or custom scheme\",\n \"Ensure the scheme matches your OAuth provider's redirect URI configuration\",\n ],\n },\n web: {\n notes: [\n \"Uses standard browser redirect for OAuth flow\",\n \"Tokens are stored in localStorage via @idealyst/storage\",\n \"Configure your OAuth provider to allow your web app's origin\",\n ],\n },\n verification: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'com.yourapp://callback',\n});\n\nawait oauth.login();`,\n troubleshooting: [\n {\n issue: \"OAuth redirect not returning to app (iOS)\",\n solution:\n \"Ensure CFBundleURLSchemes in Info.plist matches your redirectUri scheme\",\n },\n {\n issue: \"OAuth redirect not returning to app (Android)\",\n solution:\n \"Ensure intent-filter scheme in AndroidManifest matches your redirectUri\",\n },\n {\n issue: \"CORS errors on token exchange (web)\",\n solution:\n \"Token exchange must be done server-side or ensure provider supports CORS\",\n },\n ],\n },\n\n // ============================================================================\n // UI PACKAGES\n // ============================================================================\n\n datepicker: {\n packageName: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description: \"Cross-platform date and time picker components\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datepicker @idealyst/theme\",\n npm: \"npm install @idealyst/datepicker @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for calendar icons\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install (if using react-native-svg)\"],\n },\n },\n\n markdown: {\n packageName: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer with GitHub Flavored Markdown support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/markdown @idealyst/theme\",\n npm: \"npm install @idealyst/markdown @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-markdown remark-gfm\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web markdown rendering\",\n },\n {\n name: \"react-native-markdown-display react-native-webview\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native markdown rendering\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"WebView requires additional iOS configuration for some features\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration for basic markdown\",\n \"WebView is included in React Native by default\",\n ],\n },\n web: {\n additionalDependencies: [\"react-markdown\", \"remark-gfm\"],\n },\n },\n\n blur: {\n packageName: \"Blur\",\n npmName: \"@idealyst/blur\",\n description: \"Cross-platform blur component\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/blur @react-native-community/blur\",\n npm: \"npm install @idealyst/blur @react-native-community/blur\",\n },\n peerDependencies: [\n {\n name: \"@react-native-community/blur\",\n required: true,\n platforms: [\"native\"],\n note: \"Native blur implementation\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Blur uses RenderScript which is included in Android SDK\",\n \"Ensure compileSdkVersion is 31 or higher\",\n ],\n },\n web: {\n notes: [\"Uses CSS backdrop-filter for blur effect on web\"],\n },\n },\n\n lottie: {\n packageName: \"Lottie\",\n npmName: \"@idealyst/lottie\",\n description: \"Cross-platform Lottie animation support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/lottie lottie-react-native lottie-web\",\n npm: \"npm install @idealyst/lottie lottie-react-native lottie-web\",\n },\n peerDependencies: [\n {\n name: \"lottie-react-native\",\n required: true,\n platforms: [\"native\"],\n note: \"Native Lottie player\",\n },\n {\n name: \"lottie-web\",\n required: true,\n platforms: [\"web\"],\n note: \"Web Lottie player\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\"No additional configuration required\"],\n },\n },\n\n animate: {\n packageName: \"Animate\",\n npmName: \"@idealyst/animate\",\n description: \"Cross-platform animation utilities\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/animate react-native-reanimated\",\n npm: \"npm install @idealyst/animate react-native-reanimated\",\n },\n peerDependencies: [\n {\n name: \"react-native-reanimated\",\n required: true,\n platforms: [\"native\"],\n note: \"Core animation library\",\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated SVGs\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Add Reanimated Babel plugin to babel.config.js:\",\n \"plugins: ['react-native-reanimated/plugin']\",\n \"Ensure Hermes is enabled for best performance\",\n ],\n },\n },\n\n // ============================================================================\n // UTILITY PACKAGES\n // ============================================================================\n\n translate: {\n packageName: \"Translate\",\n npmName: \"@idealyst/translate\",\n description: \"Internationalization (i18n) package with Babel plugin support\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/translate i18next react-i18next\",\n npm: \"npm install @idealyst/translate i18next react-i18next\",\n },\n peerDependencies: [\n {\n name: \"i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n ],\n verification: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\n<TranslateProvider translations={translations} defaultLanguage=\"en\">\n <App />\n</TranslateProvider>`,\n },\n\n config: {\n packageName: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support\",\n platforms: [\"web\", \"native\", \"node\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/config react-native-config\",\n npm: \"npm install @idealyst/config react-native-config\",\n },\n peerDependencies: [\n {\n name: \"react-native-config\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native environment variables\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n android: {\n gradleChanges: [\n {\n file: \"android/app/build.gradle\",\n changes: `apply from: project(':react-native-config').projectDir.getPath() + \"/dotenv.gradle\"`,\n description: \"Add dotenv gradle plugin for environment variables\",\n },\n ],\n additionalSteps: [\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n web: {\n notes: [\n \"Uses Vite's import.meta.env or process.env depending on bundler\",\n \"Configure environment variables in your bundler (Vite, Webpack, etc.)\",\n ],\n },\n },\n\n // ============================================================================\n // TOOLING PACKAGES\n // ============================================================================\n\n cli: {\n packageName: \"CLI\",\n npmName: \"@idealyst/cli\",\n description: \"Command-line tool for generating Idealyst projects\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn global add @idealyst/cli\",\n npm: \"npm install -g @idealyst/cli\",\n },\n verification: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Or use directly without installing\nnpx @idealyst/cli create mobile --type native`,\n },\n\n tooling: {\n packageName: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description: \"Code analysis and validation utilities for Idealyst Framework\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add -D @idealyst/tooling\",\n npm: \"npm install -D @idealyst/tooling\",\n },\n verification: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [idealystPlugin()],\n};`,\n },\n\n \"mcp-server\": {\n packageName: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server for AI assistant integration\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/mcp-server\",\n npm: \"npm install @idealyst/mcp-server\",\n },\n verification: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n },\n\n // ============================================================================\n // FILES PACKAGE\n // ============================================================================\n\n \"files\": {\n packageName: \"Files\",\n npmName: \"@idealyst/files\",\n description:\n \"Cross-platform file picker, upload, and local file management for React and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/files\",\n npm: \"npm install @idealyst/files\",\n },\n peerDependencies: [\n {\n name: \"react-native-document-picker\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for document selection on native\",\n },\n {\n name: \"react-native-image-picker\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for image/video selection and camera capture\",\n },\n {\n name: \"react-native-blob-util\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for file uploads with progress tracking and background support\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSPhotoLibraryUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your photo library to select images\",\n description: \"Required for photo library access\",\n },\n {\n key: \"NSCameraUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your camera to take photos\",\n description: \"Required for camera capture\",\n },\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone to record video\",\n description: \"Required for video recording with audio\",\n },\n {\n key: \"UIBackgroundModes\",\n value: \"<array><string>fetch</string></array>\",\n description: \"Required for background uploads (optional)\",\n },\n ],\n additionalSteps: [\n \"Run 'cd ios && pod install' after installing dependencies\",\n \"For background uploads, add 'fetch' to UIBackgroundModes in Info.plist\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.READ_EXTERNAL_STORAGE\",\n description: \"Required for file access on Android 12 and below\",\n },\n {\n permission: \"android.permission.READ_MEDIA_IMAGES\",\n description: \"Required for image access on Android 13+\",\n },\n {\n permission: \"android.permission.READ_MEDIA_VIDEO\",\n description: \"Required for video access on Android 13+\",\n },\n {\n permission: \"android.permission.CAMERA\",\n description: \"Required for camera capture\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is at least 21 in android/build.gradle\",\n \"For Android 13+, use granular media permissions\",\n ],\n },\n web: {\n notes: [\n \"No additional configuration required for web\",\n \"Drag and drop works automatically in the DropZone component\",\n \"File picker uses native browser file input\",\n ],\n },\n verification: `import { useFilePicker, useFileUpload } from '@idealyst/files';\n\nfunction Test() {\n const { pick, files } = useFilePicker();\n const { addFiles, uploads } = useFileUpload();\n\n const handleUpload = async () => {\n const result = await pick({ allowedTypes: ['image'] });\n if (!result.cancelled) {\n addFiles(result.files, { url: '/api/upload' });\n }\n };\n\n return <Button onPress={handleUpload}>Upload</Button>;\n}`,\n troubleshooting: [\n {\n issue: \"File picker doesn't open on iOS\",\n solution:\n \"Ensure NSPhotoLibraryUsageDescription is set in Info.plist and permissions are granted\",\n },\n {\n issue: \"File picker doesn't open on Android\",\n solution:\n \"Check that storage permissions are requested at runtime for Android 13+\",\n },\n {\n issue: \"Upload progress not updating\",\n solution:\n \"Verify react-native-blob-util is installed and linked correctly\",\n },\n {\n issue: \"Background uploads fail on iOS\",\n solution:\n \"Add 'fetch' to UIBackgroundModes array in Info.plist\",\n },\n ],\n },\n};\n\n/**\n * Get installation guide for a package\n */\nexport function getInstallGuide(packageName: string): InstallGuide | undefined {\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n return installGuides[normalizedName];\n}\n\n/**\n * Get all packages that require complex native setup\n */\nexport function getComplexPackages(): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === \"complex\");\n}\n\n/**\n * Get all packages by complexity level\n */\nexport function getPackagesByComplexity(\n complexity: \"simple\" | \"moderate\" | \"complex\"\n): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === complexity);\n}\n\n/**\n * Format installation guide as markdown\n */\nexport function formatInstallGuideMarkdown(guide: InstallGuide): string {\n let md = `# ${guide.packageName} Installation Guide\n\n**Package:** \\`${guide.npmName}\\`\n**Platforms:** ${guide.platforms.join(\", \")}\n**Complexity:** ${guide.complexity}\n\n${guide.description}\n\n## Installation\n\n\\`\\`\\`bash\n# Using Yarn\n${guide.installation.yarn}\n\n# Using npm\n${guide.installation.npm}\n\\`\\`\\`\n`;\n\n // Peer Dependencies\n if (guide.peerDependencies && guide.peerDependencies.length > 0) {\n md += `\\n## Peer Dependencies\\n\\n`;\n for (const dep of guide.peerDependencies) {\n const required = dep.required ? \"**Required**\" : \"Optional\";\n const platforms = dep.platforms.join(\", \");\n md += `- \\`${dep.name}\\` - ${required} (${platforms})`;\n if (dep.note) {\n md += ` - ${dep.note}`;\n }\n md += \"\\n\";\n }\n }\n\n // iOS Configuration\n if (guide.ios && guide.platforms.includes(\"native\")) {\n md += `\\n## iOS Configuration\\n\\n`;\n\n if (guide.ios.podInstallRequired) {\n md += `\\`\\`\\`bash\ncd ios && pod install\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.ios.infoPlistEntries && guide.ios.infoPlistEntries.length > 0) {\n md += `### Info.plist Entries\\n\\nAdd the following to your \\`ios/YourApp/Info.plist\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const entry of guide.ios.infoPlistEntries) {\n md += `<!-- ${entry.description} -->\\n`;\n md += `<key>${entry.key}</key>\\n`;\n if (entry.value.includes(\"<\")) {\n md += `${entry.value}\\n`;\n } else {\n md += `<string>${entry.value}</string>\\n`;\n }\n md += \"\\n\";\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.ios.additionalSteps && guide.ios.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.ios.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Android Configuration\n if (guide.android && guide.platforms.includes(\"native\")) {\n md += `\\n## Android Configuration\\n\\n`;\n\n if (guide.android.permissions && guide.android.permissions.length > 0) {\n md += `### Permissions\\n\\nAdd to \\`android/app/src/main/AndroidManifest.xml\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const perm of guide.android.permissions) {\n md += `<!-- ${perm.description} -->\\n`;\n md += `<uses-permission android:name=\"${perm.permission}\" />\\n`;\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.android.manifestEntries && guide.android.manifestEntries.length > 0) {\n md += `### Manifest Entries\\n\\n`;\n for (const entry of guide.android.manifestEntries) {\n md += `**${entry.location}:**\\n`;\n md += `\\n\\`\\`\\`xml\\n${entry.xml}\\n\\`\\`\\`\\n\\n`;\n md += `_${entry.description}_\\n\\n`;\n }\n }\n\n if (guide.android.gradleChanges && guide.android.gradleChanges.length > 0) {\n md += `### Gradle Changes\\n\\n`;\n for (const change of guide.android.gradleChanges) {\n md += `**${change.file}:**\\n`;\n md += `\\n\\`\\`\\`groovy\\n${change.changes}\\n\\`\\`\\`\\n\\n`;\n md += `_${change.description}_\\n\\n`;\n }\n }\n\n if (guide.android.additionalSteps && guide.android.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.android.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Web Configuration\n if (guide.web && guide.platforms.includes(\"web\")) {\n md += `\\n## Web Configuration\\n\\n`;\n\n if (guide.web.additionalDependencies && guide.web.additionalDependencies.length > 0) {\n md += `### Additional Dependencies\\n\\n\\`\\`\\`bash\\nyarn add ${guide.web.additionalDependencies.join(\" \")}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.bundlerConfig) {\n md += `### Bundler Configuration\\n\\n\\`\\`\\`js\\n${guide.web.bundlerConfig}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.notes && guide.web.notes.length > 0) {\n md += `### Notes\\n\\n`;\n for (const note of guide.web.notes) {\n md += `- ${note}\\n`;\n }\n }\n }\n\n // Verification\n if (guide.verification) {\n md += `\\n## Verification\\n\\nTest your installation:\\n\\n\\`\\`\\`tsx\\n${guide.verification}\\n\\`\\`\\`\\n`;\n }\n\n // Troubleshooting\n if (guide.troubleshooting && guide.troubleshooting.length > 0) {\n md += `\\n## Troubleshooting\\n\\n`;\n for (const item of guide.troubleshooting) {\n md += `### ${item.issue}\\n\\n${item.solution}\\n\\n`;\n }\n }\n\n return md;\n}\n","/**\n * Idealyst Framework Introduction\n *\n * A wayfinding document that orients LLM agents before they start building.\n * Covers the framework paradigm, directs agents to the right tools for details,\n * and lists only the critical gotchas that agents consistently get wrong.\n *\n * Design principle: guide agents to use MCP tools for API details rather than\n * duplicating documentation here. Only include information that:\n * 1. Establishes the framework paradigm (what Idealyst IS)\n * 2. Cannot be discovered via other tools (cross-cutting conventions)\n * 3. Addresses mistakes that agents make repeatedly despite tool access\n */\n\nexport const idealystIntro = `# Idealyst Framework — Quick Reference\n\n## What is Idealyst?\n\nIdealyst is a **cross-platform React component framework** for building apps that run on iOS, Android, and Web from a single codebase. All UI comes from \\`@idealyst/components\\` — never use React Native primitives (\\`View\\`, \\`Text\\`, \\`TouchableOpacity\\`, \\`FlatList\\`, etc.) from \\`react-native\\` directly.\n\n\\`\\`\\`tsx\nimport { View, Text, Button, TextInput, Card, Icon, ... } from '@idealyst/components';\n\\`\\`\\`\n\n---\n\n## How to Use This MCP Server\n\nThis server has tools for every aspect of the framework. **Always look up the API before writing code.**\n\n### Workflow (be efficient — minimize tool calls)\n\n1. **Start here** — this intro covers conventions and gotchas\n2. **Look up components** — call \\`get_component_types\\` for EVERY component you plan to use. **Batch them in one call**: \\`get_component_types({ component: \"Button,Card,Text,View\" })\\` returns all types at once. (Card has NO compound components — no Card.Content/Card.Header)\n3. **Look up packages** — call the dedicated \\`get_*_guide\\` tool with topic \\`api\\` for each \\`@idealyst/*\\` package\n4. **Check recipes** — call \\`search_recipes\\` to find ready-made patterns for common screens\n5. **Search icons ONCE** — combine all needed icon terms into ONE \\`search_icons\\` call (e.g., \\`\"home settings check timer calendar\"\\`)\n6. **Then write code** — only after reading the types and guides. Do NOT make additional icon searches — pick from what you found\n\n### Component Tools\n- \\`list_components\\` / \\`search_components\\` — Discover available components\n- \\`get_component_docs\\` — Component features and best practices\n- \\`get_component_types\\` — **TypeScript prop interfaces** (supports batch: \\`\"Button,Card,Text\"\\`)\n- \\`get_component_examples_ts\\` — Type-checked code examples\n- \\`search_icons\\` — Find Material Design icon names (7,447 available). **Batch your needs**: search once with multiple terms like \\`\"home settings user check\"\\` rather than making separate calls per icon\n\n### Package Guide Tools\n**For any \\`@idealyst/*\\` package, call its dedicated guide tool with topic \\`api\\` BEFORE writing code.** These return complete TypeScript interfaces, return types, and correct usage. The generic \\`get_package_docs\\` tool only has summaries.\n\n| Package | Guide Tool |\n|---------|-----------|\n| \\`@idealyst/audio\\` | \\`get_audio_guide\\` |\n| \\`@idealyst/camera\\` | \\`get_camera_guide\\` |\n| \\`@idealyst/files\\` | \\`get_files_guide\\` |\n| \\`@idealyst/animate\\` | \\`get_animate_guide\\` |\n| \\`@idealyst/charts\\` | \\`get_charts_guide\\` |\n| \\`@idealyst/datagrid\\` | \\`get_datagrid_guide\\` |\n| \\`@idealyst/datepicker\\` | \\`get_datepicker_guide\\` |\n| \\`@idealyst/markdown\\` | \\`get_markdown_guide\\` |\n| \\`@idealyst/oauth-client\\` | \\`get_oauth_client_guide\\` |\n| \\`@idealyst/config\\` | \\`get_config_guide\\` |\n| \\`@idealyst/lottie\\` | \\`get_lottie_guide\\` |\n| \\`@idealyst/storage\\` | \\`get_storage_guide\\` |\n| \\`@idealyst/translate\\` | \\`get_translate_guide\\` |\n\n### Other Tools\n- \\`get_theme_types\\` — Theme type definitions (Size, Intent, Color)\n- \\`get_navigation_types\\` — Navigation API type definitions\n- \\`list_packages\\` / \\`get_package_docs\\` — Package summaries (use guide tools for full API)\n- \\`list_recipes\\` / \\`get_recipe\\` / \\`search_recipes\\` — Ready-to-use code patterns\n- \\`get_install_guide\\` — Native setup instructions (iOS/Android permissions, config)\n\n---\n\n## Cross-Cutting Conventions\n\nThese conventions apply across all components. Call \\`get_component_types\\` for specific props.\n\n### Intent & Size\nMost interactive components accept:\n- **intent:** \\`primary\\`, \\`secondary\\`, \\`success\\`, \\`warning\\`, \\`danger\\`, \\`info\\`, \\`neutral\\`\n- **size:** \\`xs\\`, \\`sm\\`, \\`md\\`, \\`lg\\`, \\`xl\\`\n\n### Icon Names\nIcons use Material Design names, typed as \\`IconName\\` (NOT \\`string\\`). Use \\`search_icons\\` to find names.\n\\`\\`\\`tsx\nimport type { IconName } from '@idealyst/components';\n\n// ALWAYS type icon variables as IconName — never as string\nconst deleteIcon: IconName = 'delete';\n\n// WRONG: do NOT use 'mdi:' prefix in variables typed as IconName\n// const icon: IconName = 'mdi:delete'; // ❌ TS error — IconName is 'delete', not 'mdi:delete'\n\n// WRONG: do NOT use plain string type\n// const icon: string = 'delete'; // ❌ won't match IconName prop type\n\n// Use IconName in ALL interfaces, arrays, and data structures\ninterface MyProps { icon: IconName; }\ninterface NavItem { label: string; icon: IconName; path: string; } // NOT icon: string\nconst tabs: { icon: IconName }[] = [{ icon: 'home' }, { icon: 'search' }]; // NOT icon: string\n\n// Icon-accepting props (leftIcon, rightIcon, icon) accept BOTH IconName and ReactNode:\n<Button leftIcon=\"check\">OK</Button> // ✅ string — simplest\n<Button leftIcon={myIcon}>OK</Button> // ✅ IconName variable\n// Do NOT wrap in <Icon>: <Button leftIcon={<Icon name=\"check\" />}> // ❌ unnecessary\n// Do NOT cast: <Button leftIcon={'check' as IconName}> // ❌ unnecessary — just use the string\n\\`\\`\\`\n\n> **CRITICAL:** Icon names do NOT have an \\`mdi:\\` prefix. Use bare names like \\`'delete'\\`, \\`'home'\\`, \\`'check-circle'\\` — NOT \\`'mdi:delete'\\`, \\`'mdi:home'\\`, etc.\n> **CRITICAL:** When defining arrays or objects with icon fields, type them as \\`IconName\\` — never \\`string\\`. Using \\`string\\` will cause TS2322 when passed to component props.\n\n---\n\n## Common Mistakes\n\nThese are mistakes agents make repeatedly. Each one causes TypeScript compilation failures.\n\n### Component Props\n1. **Text** does NOT have \\`variant\\`, \\`intent\\`, \\`size\\`, \\`fontSize\\`, \\`numberOfLines\\`, \\`ellipsizeMode\\`, \\`selectable\\`, \\`textColor\\`, or \\`onPress\\`. Use \\`typography\\` (\\`h1\\`–\\`h6\\`, \\`subtitle1\\`, \\`subtitle2\\`, \\`body1\\`, \\`body2\\`, \\`caption\\`), \\`weight\\` (\\`light\\`, \\`normal\\`, \\`medium\\`, \\`semibold\\`, \\`bold\\`), and \\`color\\` (\\`primary\\`, \\`secondary\\`, \\`tertiary\\`, \\`inverse\\`). **\\`textColor\\` is an Icon-only prop** — Text uses \\`color\\`. For pressable text, wrap in \\`Pressable\\` or use \\`Button type=\"text\"\\`.\n2. **TextInput** does NOT have \\`label\\`, \\`error\\`, \\`editable\\`, \\`autoComplete\\`, \\`keyboardType\\`, or \\`onChange\\`. Compose labels/errors with \\`Text\\` + \\`View\\`. Use \\`onChangeText\\`, \\`inputMode\\` (\\`text\\`, \\`email\\`, \\`password\\`, \\`number\\`), and \\`textContentType\\`. TextArea is different — it DOES support \\`label\\`, \\`error\\`, \\`rows\\`, \\`onChange\\`.\n3. **Button/IconButton** \\`type\\` is \\`'contained' | 'outlined' | 'text'\\` — NOT \\`'ghost'\\`, \\`'solid'\\`, \\`'default'\\`. Button has \\`leftIcon\\` and \\`rightIcon\\` — NOT \\`icon\\`.\n4. **View** does NOT have \\`direction\\`, \\`align\\`, or \\`onPress\\` props. For touch handling, wrap content in \\`Pressable\\` from \\`@idealyst/components\\` (NOT from \\`react-native\\`): \\`<Pressable onPress={handlePress}><View>...</View></Pressable>\\`. For horizontal layout use \\`style={{ flexDirection: 'row' }}\\`. View DOES have shorthand props: \\`gap\\`/\\`spacing\\`, \\`padding\\`, \\`paddingVertical\\`, \\`paddingHorizontal\\`, \\`margin\\`, \\`marginVertical\\`, \\`marginHorizontal\\` (all accept Size: \\`xs\\`|\\`sm\\`|\\`md\\`|\\`lg\\`|\\`xl\\`), plus \\`background\\`, \\`radius\\`, \\`border\\`, \\`scrollable\\`. \\`border\\` is \\`'none' | 'thin' | 'thick'\\` — NOT \\`'outline'\\`, \\`'solid'\\`.\n5. **Badge** \\`type\\` is \\`'filled' | 'outlined' | 'dot'\\` — NOT \\`'soft'\\`, \\`'subtle'\\`, \\`'solid'\\`.\n6. **Avatar** uses \\`src\\` for image URL, \\`fallback\\` for initials — NOT \\`name\\`, \\`initials\\`, \\`label\\`. Shape: \\`'circle' | 'square'\\`.\n7. **Link** requires a \\`to\\` prop (path string) — it's a navigation link, NOT pressable text.\n8. **List** takes \\`children\\` — NOT \\`data\\`, \\`renderItem\\`, or \\`keyExtractor\\`. Map your data: \\`<List>{items.map(item => <View key={item.id}>...</View>)}</List>\\`\n9. **Skeleton** uses \\`shape\\` prop (\\`'rectangle' | 'circle' | 'rounded'\\`) — NOT \\`variant\\`. Props: \\`width\\`, \\`height\\`, \\`shape\\`, \\`animation\\` (\\`'pulse' | 'wave' | 'none'\\`). Do NOT build custom skeletons with react-native \\`Animated\\`.\n10. The component is **TextInput**, NOT \\`Input\\`.\n11. **Card** is a simple container — there are NO compound components like \\`Card.Content\\`, \\`Card.Header\\`, \\`Card.Body\\`, \\`Card.Footer\\`, \\`Card.Title\\`. Just put children directly inside \\`<Card>...</Card>\\`.\n\n### Navigation\n11. Use \\`NavigatorProvider\\` — there is NO \\`Router\\` export.\n12. Use \\`useNavigator()\\` — NOT \\`useNavigate()\\`.\n13. \\`navigate()\\` takes an **object**: \\`navigate({ path: '/settings' })\\` — NOT \\`navigate('/settings')\\` or \\`navigate('routeName', params)\\`.\n14. \\`useNavigationState\\` returns \\`Record<string, unknown>\\` by default. Always provide a type parameter: \\`useNavigationState<{ title?: string }>()\\`.\n15. \\`useParams()\\` does NOT accept generic type arguments. It returns \\`Record<string, string>\\`. Do NOT write \\`useParams<{ id: string }>()\\` — that causes TS2558.\n\n### Imports & Styling\n16. **Never** import from \\`react-native\\` for UI — no \\`TouchableOpacity\\`, \\`FlatList\\`, \\`ScrollView\\`, \\`Animated\\`, \\`Dimensions\\`.\n17. **Never** import from \\`react-native-unistyles\\` — use \\`@idealyst/theme\\` (\\`configureThemes\\`, \\`ThemeSettings\\`, \\`useTheme\\`).\n18. **Custom styles**: Use \\`useTheme()\\` for theme tokens — it returns the Theme object **directly** (NOT wrapped): \\`const theme = useTheme();\\` then apply inline: \\`style={{ padding: theme.spacing.md, backgroundColor: theme.colors.surface.primary }}\\`. Do NOT use \\`const { theme } = useTheme()\\` — that causes TS2339. Do NOT use \\`StyleSheet.create\\` from react-native — use inline styles with theme tokens instead.\n\n### React 19 TypeScript\n- **useRef** requires an initial argument: \\`useRef<T>(null)\\` — NOT \\`useRef<T>()\\`. Omitting the argument causes TS2554. For non-null refs use: \\`useRef<number>(0)\\`, \\`useRef<string[]>([])\\`.\n- **Avoid web-only CSS** like \\`cursor: 'pointer'\\` in shared styles — not valid on native. Use \\`Pressable\\` or \\`Button\\` for interactive elements (they handle cursor automatically on web).\n\n### Scaffolded Project Layout\nWhen working in a CLI-scaffolded workspace (created with \\`idealyst init\\` + \\`idealyst create\\`), files go in specific locations:\n- \\`packages/api/src/trpc/routers/\\` — **Feature router files** (e.g., \\`todo.ts\\`, \\`user.ts\\`) — ALWAYS put new routers here\n- \\`packages/api/src/trpc/routers/index.ts\\` — Main appRouter definition (merge new routers here)\n- \\`packages/api/src/trpc/trpc.ts\\` — \\`router\\` and \\`publicProcedure\\` exports\n- \\`packages/database/prisma/schema.prisma\\` — Prisma models\n- \\`packages/database/src/schemas.ts\\` — Zod validation schemas\n- \\`packages/shared/src/screens/\\` — Screen components (shared across platforms)\n- \\`packages/shared/src/navigation/AppRouter.ts\\` — Route configuration\n\n**Critical:** New tRPC routers MUST go in \\`packages/api/src/trpc/routers/\\` — NEVER at the project root or \\`src/\\`. They must be merged into the main \\`appRouter\\` in \\`packages/api/src/trpc/routers/index.ts\\`.\n\n> **TIP:** Before writing backend code, call \\`search_recipes({ query: \"trpc\" })\\` to get the \\`trpc-feature\\` recipe — it has the complete step-by-step pattern with correct file paths.\n\n### Package-Specific (call guide tools for full API)\n18. **Audio** (\\`@idealyst/audio\\`) is **PCM streaming**, NOT file-based. \\`recorder.stop()\\` returns \\`void\\`. Data is \\`ArrayBufferLike\\`, NOT strings. Call \\`get_audio_guide\\` topic \\`api\\`.\n19. **Camera** (\\`@idealyst/camera\\`): Component is \\`CameraPreview\\`, NOT \\`Camera\\`. Permission is \\`requestPermission()\\`, NOT \\`requestCameraPermission\\`. \\`CameraStatus\\` is an interface (\\`.state\\`, \\`.permission\\`), NOT a string. Call \\`get_camera_guide\\` topic \\`api\\`.\n20. **Files** (\\`@idealyst/files\\`): Method is \\`pick()\\`, NOT \\`pickFiles()\\`. \\`FileType\\` is \\`'image' | 'video' | 'audio' | 'document' | 'archive' | 'any'\\` — NOT \\`'pdf'\\` or \\`'doc'\\`. Call \\`get_files_guide\\` topic \\`api\\`.\n21. **Storage** (\\`@idealyst/storage\\`): Methods are \\`getItem()\\`/\\`setItem()\\`, NOT \\`get()\\`/\\`set()\\`. Values are string-only. Call \\`get_storage_guide\\` topic \\`api\\`.\n22. **Animate** (\\`@idealyst/animate\\`): There is NO \\`useSequence\\` or \\`useKeyframes\\` — only \\`useAnimatedStyle\\`, \\`useAnimatedValue\\`, \\`usePresence\\`, \\`useGradientBorder\\`. Easing values are **camelCase**: \\`'easeOut'\\` NOT \\`'ease-out'\\`. \\`useAnimatedValue\\` REQUIRES an initial number: \\`useAnimatedValue(0)\\` — NOT \\`useAnimatedValue()\\`. Call \\`get_animate_guide\\` topic \\`api\\`.\n23. **Charts** (\\`@idealyst/charts\\`): \\`ChartDataSeries\\` requires \\`id\\` and \\`name\\` (NOT \\`label\\`). \\`AxisConfig\\` uses \\`show\\` (NOT \\`visible\\`). \\`tickFormat\\` type is \\`(value: number | string | Date) => string\\`. Call \\`get_charts_guide\\` topic \\`api\\`.\n`;\n","{\n \"total\": 7447,\n \"icons\": [\n \"ab-testing\",\n \"abacus\",\n \"abjad-arabic\",\n \"abjad-hebrew\",\n \"abugida-devanagari\",\n \"abugida-thai\",\n \"access-point\",\n \"access-point-check\",\n \"access-point-minus\",\n \"access-point-network\",\n \"access-point-network-off\",\n \"access-point-off\",\n \"access-point-plus\",\n \"access-point-remove\",\n \"account\",\n \"account-alert\",\n \"account-alert-outline\",\n \"account-arrow-down\",\n \"account-arrow-down-outline\",\n \"account-arrow-left\",\n \"account-arrow-left-outline\",\n \"account-arrow-right\",\n \"account-arrow-right-outline\",\n \"account-arrow-up\",\n \"account-arrow-up-outline\",\n \"account-badge\",\n \"account-badge-outline\",\n \"account-box\",\n \"account-box-edit-outline\",\n \"account-box-minus-outline\",\n \"account-box-multiple\",\n \"account-box-multiple-outline\",\n \"account-box-outline\",\n \"account-box-plus-outline\",\n \"account-cancel\",\n \"account-cancel-outline\",\n \"account-card\",\n \"account-card-outline\",\n \"account-cash\",\n \"account-cash-outline\",\n \"account-check\",\n \"account-check-outline\",\n \"account-child\",\n \"account-child-circle\",\n \"account-child-outline\",\n \"account-circle\",\n \"account-circle-outline\",\n \"account-clock\",\n \"account-clock-outline\",\n \"account-cog\",\n \"account-cog-outline\",\n \"account-convert\",\n \"account-convert-outline\",\n \"account-cowboy-hat\",\n \"account-cowboy-hat-outline\",\n \"account-credit-card\",\n \"account-credit-card-outline\",\n \"account-details\",\n \"account-details-outline\",\n \"account-edit\",\n \"account-edit-outline\",\n \"account-eye\",\n \"account-eye-outline\",\n \"account-file\",\n \"account-file-outline\",\n \"account-file-text\",\n \"account-file-text-outline\",\n \"account-filter\",\n \"account-filter-outline\",\n \"account-group\",\n \"account-group-outline\",\n \"account-hard-hat\",\n \"account-hard-hat-outline\",\n \"account-heart\",\n \"account-heart-outline\",\n \"account-injury\",\n \"account-injury-outline\",\n \"account-key\",\n \"account-key-outline\",\n \"account-lock\",\n \"account-lock-open\",\n \"account-lock-open-outline\",\n \"account-lock-outline\",\n \"account-minus\",\n \"account-minus-outline\",\n \"account-multiple\",\n \"account-multiple-check\",\n \"account-multiple-check-outline\",\n \"account-multiple-minus\",\n \"account-multiple-minus-outline\",\n \"account-multiple-outline\",\n \"account-multiple-plus\",\n \"account-multiple-plus-outline\",\n \"account-multiple-remove\",\n \"account-multiple-remove-outline\",\n \"account-music\",\n \"account-music-outline\",\n \"account-network\",\n \"account-network-off\",\n \"account-network-off-outline\",\n \"account-network-outline\",\n \"account-off\",\n \"account-off-outline\",\n \"account-outline\",\n \"account-plus\",\n \"account-plus-outline\",\n \"account-question\",\n \"account-question-outline\",\n \"account-reactivate\",\n \"account-reactivate-outline\",\n \"account-remove\",\n \"account-remove-outline\",\n \"account-school\",\n \"account-school-outline\",\n \"account-search\",\n \"account-search-outline\",\n \"account-settings\",\n \"account-settings-outline\",\n \"account-star\",\n \"account-star-outline\",\n \"account-supervisor\",\n \"account-supervisor-circle\",\n \"account-supervisor-circle-outline\",\n \"account-supervisor-outline\",\n \"account-switch\",\n \"account-switch-outline\",\n \"account-sync\",\n \"account-sync-outline\",\n \"account-tag\",\n \"account-tag-outline\",\n \"account-tie\",\n \"account-tie-hat\",\n \"account-tie-hat-outline\",\n \"account-tie-outline\",\n \"account-tie-voice\",\n \"account-tie-voice-off\",\n \"account-tie-voice-off-outline\",\n \"account-tie-voice-outline\",\n \"account-tie-woman\",\n \"account-voice\",\n \"account-voice-off\",\n \"account-wrench\",\n \"account-wrench-outline\",\n \"adjust\",\n \"advertisements\",\n \"advertisements-off\",\n \"air-conditioner\",\n \"air-filter\",\n \"air-horn\",\n \"air-humidifier\",\n \"air-humidifier-off\",\n \"air-purifier\",\n \"air-purifier-off\",\n \"airbag\",\n \"airballoon\",\n \"airballoon-outline\",\n \"airplane\",\n \"airplane-alert\",\n \"airplane-check\",\n \"airplane-clock\",\n \"airplane-cog\",\n \"airplane-edit\",\n \"airplane-landing\",\n \"airplane-marker\",\n \"airplane-minus\",\n \"airplane-off\",\n \"airplane-plus\",\n \"airplane-remove\",\n \"airplane-search\",\n \"airplane-settings\",\n \"airplane-takeoff\",\n \"airport\",\n \"alarm\",\n \"alarm-bell\",\n \"alarm-check\",\n \"alarm-light\",\n \"alarm-light-off\",\n \"alarm-light-off-outline\",\n \"alarm-light-outline\",\n \"alarm-multiple\",\n \"alarm-note\",\n \"alarm-note-off\",\n \"alarm-off\",\n \"alarm-panel\",\n \"alarm-panel-outline\",\n \"alarm-plus\",\n \"alarm-snooze\",\n \"album\",\n \"alert\",\n \"alert-box\",\n \"alert-box-outline\",\n \"alert-circle\",\n \"alert-circle-check\",\n \"alert-circle-check-outline\",\n \"alert-circle-outline\",\n \"alert-decagram\",\n \"alert-decagram-outline\",\n \"alert-minus\",\n \"alert-minus-outline\",\n \"alert-octagon\",\n \"alert-octagon-outline\",\n \"alert-octagram\",\n \"alert-octagram-outline\",\n \"alert-outline\",\n \"alert-plus\",\n \"alert-plus-outline\",\n \"alert-remove\",\n \"alert-remove-outline\",\n \"alert-rhombus\",\n \"alert-rhombus-outline\",\n \"alien\",\n \"alien-outline\",\n \"align-horizontal-center\",\n \"align-horizontal-distribute\",\n \"align-horizontal-left\",\n \"align-horizontal-right\",\n \"align-vertical-bottom\",\n \"align-vertical-center\",\n \"align-vertical-distribute\",\n \"align-vertical-top\",\n \"all-inclusive\",\n \"all-inclusive-box\",\n \"all-inclusive-box-outline\",\n \"allergy\",\n \"alpha\",\n \"alpha-a\",\n \"alpha-a-box\",\n \"alpha-a-box-outline\",\n \"alpha-a-circle\",\n \"alpha-a-circle-outline\",\n \"alpha-b\",\n \"alpha-b-box\",\n \"alpha-b-box-outline\",\n \"alpha-b-circle\",\n \"alpha-b-circle-outline\",\n \"alpha-c\",\n \"alpha-c-box\",\n \"alpha-c-box-outline\",\n \"alpha-c-circle\",\n \"alpha-c-circle-outline\",\n \"alpha-d\",\n \"alpha-d-box\",\n \"alpha-d-box-outline\",\n \"alpha-d-circle\",\n \"alpha-d-circle-outline\",\n \"alpha-e\",\n \"alpha-e-box\",\n \"alpha-e-box-outline\",\n \"alpha-e-circle\",\n \"alpha-e-circle-outline\",\n \"alpha-f\",\n \"alpha-f-box\",\n \"alpha-f-box-outline\",\n \"alpha-f-circle\",\n \"alpha-f-circle-outline\",\n \"alpha-g\",\n \"alpha-g-box\",\n \"alpha-g-box-outline\",\n \"alpha-g-circle\",\n \"alpha-g-circle-outline\",\n \"alpha-h\",\n \"alpha-h-box\",\n \"alpha-h-box-outline\",\n \"alpha-h-circle\",\n \"alpha-h-circle-outline\",\n \"alpha-i\",\n \"alpha-i-box\",\n \"alpha-i-box-outline\",\n \"alpha-i-circle\",\n \"alpha-i-circle-outline\",\n \"alpha-j\",\n \"alpha-j-box\",\n \"alpha-j-box-outline\",\n \"alpha-j-circle\",\n \"alpha-j-circle-outline\",\n \"alpha-k\",\n \"alpha-k-box\",\n \"alpha-k-box-outline\",\n \"alpha-k-circle\",\n \"alpha-k-circle-outline\",\n \"alpha-l\",\n \"alpha-l-box\",\n \"alpha-l-box-outline\",\n \"alpha-l-circle\",\n \"alpha-l-circle-outline\",\n \"alpha-m\",\n \"alpha-m-box\",\n \"alpha-m-box-outline\",\n \"alpha-m-circle\",\n \"alpha-m-circle-outline\",\n \"alpha-n\",\n \"alpha-n-box\",\n \"alpha-n-box-outline\",\n \"alpha-n-circle\",\n \"alpha-n-circle-outline\",\n \"alpha-o\",\n \"alpha-o-box\",\n \"alpha-o-box-outline\",\n \"alpha-o-circle\",\n \"alpha-o-circle-outline\",\n \"alpha-p\",\n \"alpha-p-box\",\n \"alpha-p-box-outline\",\n \"alpha-p-circle\",\n \"alpha-p-circle-outline\",\n \"alpha-q\",\n \"alpha-q-box\",\n \"alpha-q-box-outline\",\n \"alpha-q-circle\",\n \"alpha-q-circle-outline\",\n \"alpha-r\",\n \"alpha-r-box\",\n \"alpha-r-box-outline\",\n \"alpha-r-circle\",\n \"alpha-r-circle-outline\",\n \"alpha-s\",\n \"alpha-s-box\",\n \"alpha-s-box-outline\",\n \"alpha-s-circle\",\n \"alpha-s-circle-outline\",\n \"alpha-t\",\n \"alpha-t-box\",\n \"alpha-t-box-outline\",\n \"alpha-t-circle\",\n \"alpha-t-circle-outline\",\n \"alpha-u\",\n \"alpha-u-box\",\n \"alpha-u-box-outline\",\n \"alpha-u-circle\",\n \"alpha-u-circle-outline\",\n \"alpha-v\",\n \"alpha-v-box\",\n \"alpha-v-box-outline\",\n \"alpha-v-circle\",\n \"alpha-v-circle-outline\",\n \"alpha-w\",\n \"alpha-w-box\",\n \"alpha-w-box-outline\",\n \"alpha-w-circle\",\n \"alpha-w-circle-outline\",\n \"alpha-x\",\n \"alpha-x-box\",\n \"alpha-x-box-outline\",\n \"alpha-x-circle\",\n \"alpha-x-circle-outline\",\n \"alpha-y\",\n \"alpha-y-box\",\n \"alpha-y-box-outline\",\n \"alpha-y-circle\",\n \"alpha-y-circle-outline\",\n \"alpha-z\",\n \"alpha-z-box\",\n \"alpha-z-box-outline\",\n \"alpha-z-circle\",\n \"alpha-z-circle-outline\",\n \"alphabet-aurebesh\",\n \"alphabet-cyrillic\",\n \"alphabet-greek\",\n \"alphabet-latin\",\n \"alphabet-piqad\",\n \"alphabet-tengwar\",\n \"alphabetical\",\n \"alphabetical-off\",\n \"alphabetical-variant\",\n \"alphabetical-variant-off\",\n \"altimeter\",\n \"ambulance\",\n \"ammunition\",\n \"ampersand\",\n \"amplifier\",\n \"amplifier-off\",\n \"anchor\",\n \"android\",\n \"android-studio\",\n \"angle-acute\",\n \"angle-obtuse\",\n \"angle-right\",\n \"angular\",\n \"angularjs\",\n \"animation\",\n \"animation-outline\",\n \"animation-play\",\n \"animation-play-outline\",\n \"ansible\",\n \"antenna\",\n \"anvil\",\n \"apache-kafka\",\n \"api\",\n \"api-off\",\n \"apple\",\n \"apple-finder\",\n \"apple-icloud\",\n \"apple-ios\",\n \"apple-keyboard-caps\",\n \"apple-keyboard-command\",\n \"apple-keyboard-control\",\n \"apple-keyboard-option\",\n \"apple-keyboard-shift\",\n \"apple-safari\",\n \"application\",\n \"application-array\",\n \"application-array-outline\",\n \"application-braces\",\n \"application-braces-outline\",\n \"application-brackets\",\n \"application-brackets-outline\",\n \"application-cog\",\n \"application-cog-outline\",\n \"application-edit\",\n \"application-edit-outline\",\n \"application-export\",\n \"application-import\",\n \"application-outline\",\n \"application-parentheses\",\n \"application-parentheses-outline\",\n \"application-settings\",\n \"application-settings-outline\",\n \"application-variable\",\n \"application-variable-outline\",\n \"approximately-equal\",\n \"approximately-equal-box\",\n \"apps\",\n \"apps-box\",\n \"arch\",\n \"archive\",\n \"archive-alert\",\n \"archive-alert-outline\",\n \"archive-arrow-down\",\n \"archive-arrow-down-outline\",\n \"archive-arrow-up\",\n \"archive-arrow-up-outline\",\n \"archive-cancel\",\n \"archive-cancel-outline\",\n \"archive-check\",\n \"archive-check-outline\",\n \"archive-clock\",\n \"archive-clock-outline\",\n \"archive-cog\",\n \"archive-cog-outline\",\n \"archive-edit\",\n \"archive-edit-outline\",\n \"archive-eye\",\n \"archive-eye-outline\",\n \"archive-lock\",\n \"archive-lock-open\",\n \"archive-lock-open-outline\",\n \"archive-lock-outline\",\n \"archive-marker\",\n \"archive-marker-outline\",\n \"archive-minus\",\n \"archive-minus-outline\",\n \"archive-music\",\n \"archive-music-outline\",\n \"archive-off\",\n \"archive-off-outline\",\n \"archive-outline\",\n \"archive-plus\",\n \"archive-plus-outline\",\n \"archive-refresh\",\n \"archive-refresh-outline\",\n \"archive-remove\",\n \"archive-remove-outline\",\n \"archive-search\",\n \"archive-search-outline\",\n \"archive-settings\",\n \"archive-settings-outline\",\n \"archive-star\",\n \"archive-star-outline\",\n \"archive-sync\",\n \"archive-sync-outline\",\n \"arm-flex\",\n \"arm-flex-outline\",\n \"arrange-bring-forward\",\n \"arrange-bring-to-front\",\n \"arrange-send-backward\",\n \"arrange-send-to-back\",\n \"arrow-all\",\n \"arrow-bottom-left\",\n \"arrow-bottom-left-bold-box\",\n \"arrow-bottom-left-bold-box-outline\",\n \"arrow-bottom-left-bold-outline\",\n \"arrow-bottom-left-thick\",\n \"arrow-bottom-left-thin\",\n \"arrow-bottom-left-thin-circle-outline\",\n \"arrow-bottom-right\",\n \"arrow-bottom-right-bold-box\",\n \"arrow-bottom-right-bold-box-outline\",\n \"arrow-bottom-right-bold-outline\",\n \"arrow-bottom-right-thick\",\n \"arrow-bottom-right-thin\",\n \"arrow-bottom-right-thin-circle-outline\",\n \"arrow-collapse\",\n \"arrow-collapse-all\",\n \"arrow-collapse-down\",\n \"arrow-collapse-horizontal\",\n \"arrow-collapse-left\",\n \"arrow-collapse-right\",\n \"arrow-collapse-up\",\n \"arrow-collapse-vertical\",\n \"arrow-decision\",\n \"arrow-decision-auto\",\n \"arrow-decision-auto-outline\",\n \"arrow-decision-outline\",\n \"arrow-down\",\n \"arrow-down-bold\",\n \"arrow-down-bold-box\",\n \"arrow-down-bold-box-outline\",\n \"arrow-down-bold-circle\",\n \"arrow-down-bold-circle-outline\",\n \"arrow-down-bold-hexagon-outline\",\n \"arrow-down-bold-outline\",\n \"arrow-down-box\",\n \"arrow-down-circle\",\n \"arrow-down-circle-outline\",\n \"arrow-down-drop-circle\",\n \"arrow-down-drop-circle-outline\",\n \"arrow-down-left\",\n \"arrow-down-left-bold\",\n \"arrow-down-right\",\n \"arrow-down-right-bold\",\n \"arrow-down-thick\",\n \"arrow-down-thin\",\n \"arrow-down-thin-circle-outline\",\n \"arrow-expand\",\n \"arrow-expand-all\",\n \"arrow-expand-down\",\n \"arrow-expand-horizontal\",\n \"arrow-expand-left\",\n \"arrow-expand-right\",\n \"arrow-expand-up\",\n \"arrow-expand-vertical\",\n \"arrow-horizontal-lock\",\n \"arrow-left\",\n \"arrow-left-bold\",\n \"arrow-left-bold-box\",\n \"arrow-left-bold-box-outline\",\n \"arrow-left-bold-circle\",\n \"arrow-left-bold-circle-outline\",\n \"arrow-left-bold-hexagon-outline\",\n \"arrow-left-bold-outline\",\n \"arrow-left-bottom\",\n \"arrow-left-bottom-bold\",\n \"arrow-left-box\",\n \"arrow-left-circle\",\n \"arrow-left-circle-outline\",\n \"arrow-left-drop-circle\",\n \"arrow-left-drop-circle-outline\",\n \"arrow-left-right\",\n \"arrow-left-right-bold\",\n \"arrow-left-right-bold-outline\",\n \"arrow-left-thick\",\n \"arrow-left-thin\",\n \"arrow-left-thin-circle-outline\",\n \"arrow-left-top\",\n \"arrow-left-top-bold\",\n \"arrow-oscillating\",\n \"arrow-oscillating-off\",\n \"arrow-projectile\",\n \"arrow-projectile-multiple\",\n \"arrow-right\",\n \"arrow-right-bold\",\n \"arrow-right-bold-box\",\n \"arrow-right-bold-box-outline\",\n \"arrow-right-bold-circle\",\n \"arrow-right-bold-circle-outline\",\n \"arrow-right-bold-hexagon-outline\",\n \"arrow-right-bold-outline\",\n \"arrow-right-bottom\",\n \"arrow-right-bottom-bold\",\n \"arrow-right-box\",\n \"arrow-right-circle\",\n \"arrow-right-circle-outline\",\n \"arrow-right-drop-circle\",\n \"arrow-right-drop-circle-outline\",\n \"arrow-right-thick\",\n \"arrow-right-thin\",\n \"arrow-right-thin-circle-outline\",\n \"arrow-right-top\",\n \"arrow-right-top-bold\",\n \"arrow-split-horizontal\",\n \"arrow-split-vertical\",\n \"arrow-top-left\",\n \"arrow-top-left-bold-box\",\n \"arrow-top-left-bold-box-outline\",\n \"arrow-top-left-bold-outline\",\n \"arrow-top-left-bottom-right\",\n \"arrow-top-left-bottom-right-bold\",\n \"arrow-top-left-thick\",\n \"arrow-top-left-thin\",\n \"arrow-top-left-thin-circle-outline\",\n \"arrow-top-right\",\n \"arrow-top-right-bold-box\",\n \"arrow-top-right-bold-box-outline\",\n \"arrow-top-right-bold-outline\",\n \"arrow-top-right-bottom-left\",\n \"arrow-top-right-bottom-left-bold\",\n \"arrow-top-right-thick\",\n \"arrow-top-right-thin\",\n \"arrow-top-right-thin-circle-outline\",\n \"arrow-u-down-left\",\n \"arrow-u-down-left-bold\",\n \"arrow-u-down-right\",\n \"arrow-u-down-right-bold\",\n \"arrow-u-left-bottom\",\n \"arrow-u-left-bottom-bold\",\n \"arrow-u-left-top\",\n \"arrow-u-left-top-bold\",\n \"arrow-u-right-bottom\",\n \"arrow-u-right-bottom-bold\",\n \"arrow-u-right-top\",\n \"arrow-u-right-top-bold\",\n \"arrow-u-up-left\",\n \"arrow-u-up-left-bold\",\n \"arrow-u-up-right\",\n \"arrow-u-up-right-bold\",\n \"arrow-up\",\n \"arrow-up-bold\",\n \"arrow-up-bold-box\",\n \"arrow-up-bold-box-outline\",\n \"arrow-up-bold-circle\",\n \"arrow-up-bold-circle-outline\",\n \"arrow-up-bold-hexagon-outline\",\n \"arrow-up-bold-outline\",\n \"arrow-up-box\",\n \"arrow-up-circle\",\n \"arrow-up-circle-outline\",\n \"arrow-up-down\",\n \"arrow-up-down-bold\",\n \"arrow-up-down-bold-outline\",\n \"arrow-up-drop-circle\",\n \"arrow-up-drop-circle-outline\",\n \"arrow-up-left\",\n \"arrow-up-left-bold\",\n \"arrow-up-right\",\n \"arrow-up-right-bold\",\n \"arrow-up-thick\",\n \"arrow-up-thin\",\n \"arrow-up-thin-circle-outline\",\n \"arrow-vertical-lock\",\n \"artboard\",\n \"artstation\",\n \"aspect-ratio\",\n \"assistant\",\n \"asterisk\",\n \"asterisk-circle-outline\",\n \"at\",\n \"atlassian\",\n \"atm\",\n \"atom\",\n \"atom-variant\",\n \"attachment\",\n \"attachment-check\",\n \"attachment-lock\",\n \"attachment-minus\",\n \"attachment-off\",\n \"attachment-plus\",\n \"attachment-remove\",\n \"atv\",\n \"audio-input-rca\",\n \"audio-input-stereo-minijack\",\n \"audio-input-xlr\",\n \"audio-video\",\n \"audio-video-off\",\n \"augmented-reality\",\n \"aurora\",\n \"auto-download\",\n \"auto-fix\",\n \"auto-mode\",\n \"auto-upload\",\n \"autorenew\",\n \"autorenew-off\",\n \"av-timer\",\n \"awning\",\n \"awning-outline\",\n \"aws\",\n \"axe\",\n \"axe-battle\",\n \"axis\",\n \"axis-arrow\",\n \"axis-arrow-info\",\n \"axis-arrow-lock\",\n \"axis-lock\",\n \"axis-x-arrow\",\n \"axis-x-arrow-lock\",\n \"axis-x-rotate-clockwise\",\n \"axis-x-rotate-counterclockwise\",\n \"axis-x-y-arrow-lock\",\n \"axis-y-arrow\",\n \"axis-y-arrow-lock\",\n \"axis-y-rotate-clockwise\",\n \"axis-y-rotate-counterclockwise\",\n \"axis-z-arrow\",\n \"axis-z-arrow-lock\",\n \"axis-z-rotate-clockwise\",\n \"axis-z-rotate-counterclockwise\",\n \"babel\",\n \"baby\",\n \"baby-bottle\",\n \"baby-bottle-outline\",\n \"baby-buggy\",\n \"baby-buggy-off\",\n \"baby-carriage\",\n \"baby-carriage-off\",\n \"baby-face\",\n \"baby-face-outline\",\n \"backburger\",\n \"backspace\",\n \"backspace-outline\",\n \"backspace-reverse\",\n \"backspace-reverse-outline\",\n \"backup-restore\",\n \"bacteria\",\n \"bacteria-outline\",\n \"badge-account\",\n \"badge-account-alert\",\n \"badge-account-alert-outline\",\n \"badge-account-horizontal\",\n \"badge-account-horizontal-outline\",\n \"badge-account-outline\",\n \"badminton\",\n \"bag-carry-on\",\n \"bag-carry-on-check\",\n \"bag-carry-on-off\",\n \"bag-checked\",\n \"bag-personal\",\n \"bag-personal-off\",\n \"bag-personal-off-outline\",\n \"bag-personal-outline\",\n \"bag-personal-plus\",\n \"bag-personal-plus-outline\",\n \"bag-personal-tag\",\n \"bag-personal-tag-outline\",\n \"bag-suitcase\",\n \"bag-suitcase-off\",\n \"bag-suitcase-off-outline\",\n \"bag-suitcase-outline\",\n \"baguette\",\n \"balcony\",\n \"balloon\",\n \"ballot\",\n \"ballot-outline\",\n \"ballot-recount\",\n \"ballot-recount-outline\",\n \"bandage\",\n \"bank\",\n \"bank-check\",\n \"bank-circle\",\n \"bank-circle-outline\",\n \"bank-minus\",\n \"bank-off\",\n \"bank-off-outline\",\n \"bank-outline\",\n \"bank-plus\",\n \"bank-remove\",\n \"bank-transfer\",\n \"bank-transfer-in\",\n \"bank-transfer-out\",\n \"barcode\",\n \"barcode-off\",\n \"barcode-scan\",\n \"barley\",\n \"barley-off\",\n \"barn\",\n \"barrel\",\n \"barrel-outline\",\n \"baseball\",\n \"baseball-bat\",\n \"baseball-diamond\",\n \"baseball-diamond-outline\",\n \"baseball-outline\",\n \"bash\",\n \"basket\",\n \"basket-check\",\n \"basket-check-outline\",\n \"basket-fill\",\n \"basket-minus\",\n \"basket-minus-outline\",\n \"basket-off\",\n \"basket-off-outline\",\n \"basket-outline\",\n \"basket-plus\",\n \"basket-plus-outline\",\n \"basket-remove\",\n \"basket-remove-outline\",\n \"basket-unfill\",\n \"basketball\",\n \"basketball-hoop\",\n \"basketball-hoop-outline\",\n \"bat\",\n \"bathtub\",\n \"bathtub-outline\",\n \"battery\",\n \"battery-10\",\n \"battery-10-bluetooth\",\n \"battery-20\",\n \"battery-20-bluetooth\",\n \"battery-30\",\n \"battery-30-bluetooth\",\n \"battery-40\",\n \"battery-40-bluetooth\",\n \"battery-50\",\n \"battery-50-bluetooth\",\n \"battery-60\",\n \"battery-60-bluetooth\",\n \"battery-70\",\n \"battery-70-bluetooth\",\n \"battery-80\",\n \"battery-80-bluetooth\",\n \"battery-90\",\n \"battery-90-bluetooth\",\n \"battery-alert\",\n \"battery-alert-bluetooth\",\n \"battery-alert-variant\",\n \"battery-alert-variant-outline\",\n \"battery-arrow-down\",\n \"battery-arrow-down-outline\",\n \"battery-arrow-up\",\n \"battery-arrow-up-outline\",\n \"battery-bluetooth\",\n \"battery-bluetooth-variant\",\n \"battery-charging\",\n \"battery-charging-10\",\n \"battery-charging-100\",\n \"battery-charging-20\",\n \"battery-charging-30\",\n \"battery-charging-40\",\n \"battery-charging-50\",\n \"battery-charging-60\",\n \"battery-charging-70\",\n \"battery-charging-80\",\n \"battery-charging-90\",\n \"battery-charging-high\",\n \"battery-charging-low\",\n \"battery-charging-medium\",\n \"battery-charging-outline\",\n \"battery-charging-wireless\",\n \"battery-charging-wireless-10\",\n \"battery-charging-wireless-20\",\n \"battery-charging-wireless-30\",\n \"battery-charging-wireless-40\",\n \"battery-charging-wireless-50\",\n \"battery-charging-wireless-60\",\n \"battery-charging-wireless-70\",\n \"battery-charging-wireless-80\",\n \"battery-charging-wireless-90\",\n \"battery-charging-wireless-alert\",\n \"battery-charging-wireless-outline\",\n \"battery-check\",\n \"battery-check-outline\",\n \"battery-clock\",\n \"battery-clock-outline\",\n \"battery-heart\",\n \"battery-heart-outline\",\n \"battery-heart-variant\",\n \"battery-high\",\n \"battery-lock\",\n \"battery-lock-open\",\n \"battery-low\",\n \"battery-medium\",\n \"battery-minus\",\n \"battery-minus-outline\",\n \"battery-minus-variant\",\n \"battery-negative\",\n \"battery-off\",\n \"battery-off-outline\",\n \"battery-outline\",\n \"battery-plus\",\n \"battery-plus-outline\",\n \"battery-plus-variant\",\n \"battery-positive\",\n \"battery-remove\",\n \"battery-remove-outline\",\n \"battery-sync\",\n \"battery-sync-outline\",\n \"battery-unknown\",\n \"battery-unknown-bluetooth\",\n \"beach\",\n \"beaker\",\n \"beaker-alert\",\n \"beaker-alert-outline\",\n \"beaker-check\",\n \"beaker-check-outline\",\n \"beaker-minus\",\n \"beaker-minus-outline\",\n \"beaker-outline\",\n \"beaker-plus\",\n \"beaker-plus-outline\",\n \"beaker-question\",\n \"beaker-question-outline\",\n \"beaker-remove\",\n \"beaker-remove-outline\",\n \"bed\",\n \"bed-clock\",\n \"bed-double\",\n \"bed-double-outline\",\n \"bed-empty\",\n \"bed-king\",\n \"bed-king-outline\",\n \"bed-outline\",\n \"bed-queen\",\n \"bed-queen-outline\",\n \"bed-single\",\n \"bed-single-outline\",\n \"bee\",\n \"bee-flower\",\n \"beehive-off-outline\",\n \"beehive-outline\",\n \"beekeeper\",\n \"beer\",\n \"beer-outline\",\n \"bell\",\n \"bell-alert\",\n \"bell-alert-outline\",\n \"bell-badge\",\n \"bell-badge-outline\",\n \"bell-cancel\",\n \"bell-cancel-outline\",\n \"bell-check\",\n \"bell-check-outline\",\n \"bell-circle\",\n \"bell-circle-outline\",\n \"bell-cog\",\n \"bell-cog-outline\",\n \"bell-minus\",\n \"bell-minus-outline\",\n \"bell-off\",\n \"bell-off-outline\",\n \"bell-outline\",\n \"bell-plus\",\n \"bell-plus-outline\",\n \"bell-remove\",\n \"bell-remove-outline\",\n \"bell-ring\",\n \"bell-ring-outline\",\n \"bell-sleep\",\n \"bell-sleep-outline\",\n \"bench\",\n \"bench-back\",\n \"beta\",\n \"betamax\",\n \"biathlon\",\n \"bicycle\",\n \"bicycle-basket\",\n \"bicycle-cargo\",\n \"bicycle-electric\",\n \"bicycle-penny-farthing\",\n \"bike\",\n \"bike-fast\",\n \"bike-pedal\",\n \"bike-pedal-clipless\",\n \"bike-pedal-mountain\",\n \"billboard\",\n \"billiards\",\n \"billiards-rack\",\n \"binoculars\",\n \"bio\",\n \"biohazard\",\n \"bird\",\n \"bitbucket\",\n \"bitcoin\",\n \"black-mesa\",\n \"blender\",\n \"blender-outline\",\n \"blender-software\",\n \"blinds\",\n \"blinds-horizontal\",\n \"blinds-horizontal-closed\",\n \"blinds-open\",\n \"blinds-vertical\",\n \"blinds-vertical-closed\",\n \"block-helper\",\n \"blood-bag\",\n \"bluetooth\",\n \"bluetooth-audio\",\n \"bluetooth-connect\",\n \"bluetooth-off\",\n \"bluetooth-settings\",\n \"bluetooth-transfer\",\n \"blur\",\n \"blur-linear\",\n \"blur-off\",\n \"blur-radial\",\n \"bolt\",\n \"bomb\",\n \"bomb-off\",\n \"bone\",\n \"bone-off\",\n \"book\",\n \"book-account\",\n \"book-account-outline\",\n \"book-alert\",\n \"book-alert-outline\",\n \"book-alphabet\",\n \"book-arrow-down\",\n \"book-arrow-down-outline\",\n \"book-arrow-left\",\n \"book-arrow-left-outline\",\n \"book-arrow-right\",\n \"book-arrow-right-outline\",\n \"book-arrow-up\",\n \"book-arrow-up-outline\",\n \"book-cancel\",\n \"book-cancel-outline\",\n \"book-check\",\n \"book-check-outline\",\n \"book-clock\",\n \"book-clock-outline\",\n \"book-cog\",\n \"book-cog-outline\",\n \"book-cross\",\n \"book-edit\",\n \"book-edit-outline\",\n \"book-education\",\n \"book-education-outline\",\n \"book-heart\",\n \"book-heart-outline\",\n \"book-information-variant\",\n \"book-lock\",\n \"book-lock-open\",\n \"book-lock-open-outline\",\n \"book-lock-outline\",\n \"book-marker\",\n \"book-marker-outline\",\n \"book-minus\",\n \"book-minus-multiple\",\n \"book-minus-multiple-outline\",\n \"book-minus-outline\",\n \"book-multiple\",\n \"book-multiple-outline\",\n \"book-music\",\n \"book-music-outline\",\n \"book-off\",\n \"book-off-outline\",\n \"book-open\",\n \"book-open-blank-variant\",\n \"book-open-blank-variant-outline\",\n \"book-open-outline\",\n \"book-open-page-variant\",\n \"book-open-page-variant-outline\",\n \"book-open-variant\",\n \"book-open-variant-outline\",\n \"book-outline\",\n \"book-play\",\n \"book-play-outline\",\n \"book-plus\",\n \"book-plus-multiple\",\n \"book-plus-multiple-outline\",\n \"book-plus-outline\",\n \"book-refresh\",\n \"book-refresh-outline\",\n \"book-remove\",\n \"book-remove-multiple\",\n \"book-remove-multiple-outline\",\n \"book-remove-outline\",\n \"book-search\",\n \"book-search-outline\",\n \"book-settings\",\n \"book-settings-outline\",\n \"book-sync\",\n \"book-sync-outline\",\n \"book-variant\",\n \"bookmark\",\n \"bookmark-box\",\n \"bookmark-box-multiple\",\n \"bookmark-box-multiple-outline\",\n \"bookmark-box-outline\",\n \"bookmark-check\",\n \"bookmark-check-outline\",\n \"bookmark-minus\",\n \"bookmark-minus-outline\",\n \"bookmark-multiple\",\n \"bookmark-multiple-outline\",\n \"bookmark-music\",\n \"bookmark-music-outline\",\n \"bookmark-off\",\n \"bookmark-off-outline\",\n \"bookmark-outline\",\n \"bookmark-plus\",\n \"bookmark-plus-outline\",\n \"bookmark-remove\",\n \"bookmark-remove-outline\",\n \"bookshelf\",\n \"boom-gate\",\n \"boom-gate-alert\",\n \"boom-gate-alert-outline\",\n \"boom-gate-arrow-down\",\n \"boom-gate-arrow-down-outline\",\n \"boom-gate-arrow-up\",\n \"boom-gate-arrow-up-outline\",\n \"boom-gate-outline\",\n \"boom-gate-up\",\n \"boom-gate-up-outline\",\n \"boombox\",\n \"boomerang\",\n \"bootstrap\",\n \"border-all\",\n \"border-all-variant\",\n \"border-bottom\",\n \"border-bottom-variant\",\n \"border-color\",\n \"border-horizontal\",\n \"border-inside\",\n \"border-left\",\n \"border-left-variant\",\n \"border-none\",\n \"border-none-variant\",\n \"border-outside\",\n \"border-radius\",\n \"border-right\",\n \"border-right-variant\",\n \"border-style\",\n \"border-top\",\n \"border-top-variant\",\n \"border-vertical\",\n \"bottle-soda\",\n \"bottle-soda-classic\",\n \"bottle-soda-classic-outline\",\n \"bottle-soda-outline\",\n \"bottle-tonic\",\n \"bottle-tonic-outline\",\n \"bottle-tonic-plus\",\n \"bottle-tonic-plus-outline\",\n \"bottle-tonic-skull\",\n \"bottle-tonic-skull-outline\",\n \"bottle-wine\",\n \"bottle-wine-outline\",\n \"bow-arrow\",\n \"bow-tie\",\n \"bowl\",\n \"bowl-mix\",\n \"bowl-mix-outline\",\n \"bowl-outline\",\n \"bowling\",\n \"box\",\n \"box-cutter\",\n \"box-cutter-off\",\n \"box-shadow\",\n \"boxing-glove\",\n \"braille\",\n \"brain\",\n \"bread-slice\",\n \"bread-slice-outline\",\n \"bridge\",\n \"briefcase\",\n \"briefcase-account\",\n \"briefcase-account-outline\",\n \"briefcase-arrow-left-right\",\n \"briefcase-arrow-left-right-outline\",\n \"briefcase-arrow-up-down\",\n \"briefcase-arrow-up-down-outline\",\n \"briefcase-check\",\n \"briefcase-check-outline\",\n \"briefcase-clock\",\n \"briefcase-clock-outline\",\n \"briefcase-download\",\n \"briefcase-download-outline\",\n \"briefcase-edit\",\n \"briefcase-edit-outline\",\n \"briefcase-eye\",\n \"briefcase-eye-outline\",\n \"briefcase-minus\",\n \"briefcase-minus-outline\",\n \"briefcase-off\",\n \"briefcase-off-outline\",\n \"briefcase-outline\",\n \"briefcase-plus\",\n \"briefcase-plus-outline\",\n \"briefcase-remove\",\n \"briefcase-remove-outline\",\n \"briefcase-search\",\n \"briefcase-search-outline\",\n \"briefcase-upload\",\n \"briefcase-upload-outline\",\n \"briefcase-variant\",\n \"briefcase-variant-off\",\n \"briefcase-variant-off-outline\",\n \"briefcase-variant-outline\",\n \"brightness-1\",\n \"brightness-2\",\n \"brightness-3\",\n \"brightness-4\",\n \"brightness-5\",\n \"brightness-6\",\n \"brightness-7\",\n \"brightness-auto\",\n \"brightness-percent\",\n \"broadcast\",\n \"broadcast-off\",\n \"broom\",\n \"brush\",\n \"brush-off\",\n \"brush-outline\",\n \"brush-variant\",\n \"bucket\",\n \"bucket-outline\",\n \"buffet\",\n \"bug\",\n \"bug-check\",\n \"bug-check-outline\",\n \"bug-outline\",\n \"bug-pause\",\n \"bug-pause-outline\",\n \"bug-play\",\n \"bug-play-outline\",\n \"bug-stop\",\n \"bug-stop-outline\",\n \"bugle\",\n \"bulkhead-light\",\n \"bulldozer\",\n \"bullet\",\n \"bulletin-board\",\n \"bullhorn\",\n \"bullhorn-outline\",\n \"bullhorn-variant\",\n \"bullhorn-variant-outline\",\n \"bullseye\",\n \"bullseye-arrow\",\n \"bulma\",\n \"bunk-bed\",\n \"bunk-bed-outline\",\n \"bus\",\n \"bus-alert\",\n \"bus-articulated-end\",\n \"bus-articulated-front\",\n \"bus-clock\",\n \"bus-double-decker\",\n \"bus-electric\",\n \"bus-marker\",\n \"bus-multiple\",\n \"bus-school\",\n \"bus-side\",\n \"bus-sign\",\n \"bus-stop\",\n \"bus-stop-covered\",\n \"bus-stop-uncovered\",\n \"bus-wrench\",\n \"butterfly\",\n \"butterfly-outline\",\n \"button-cursor\",\n \"button-pointer\",\n \"cabin-a-frame\",\n \"cable-data\",\n \"cached\",\n \"cactus\",\n \"cake\",\n \"cake-layered\",\n \"cake-variant\",\n \"cake-variant-outline\",\n \"calculator\",\n \"calculator-variant\",\n \"calculator-variant-outline\",\n \"calendar\",\n \"calendar-account\",\n \"calendar-account-outline\",\n \"calendar-alert\",\n \"calendar-alert-outline\",\n \"calendar-arrow-left\",\n \"calendar-arrow-right\",\n \"calendar-badge\",\n \"calendar-badge-outline\",\n \"calendar-blank\",\n \"calendar-blank-multiple\",\n \"calendar-blank-outline\",\n \"calendar-check\",\n \"calendar-check-outline\",\n \"calendar-clock\",\n \"calendar-clock-outline\",\n \"calendar-collapse-horizontal\",\n \"calendar-collapse-horizontal-outline\",\n \"calendar-cursor\",\n \"calendar-cursor-outline\",\n \"calendar-edit\",\n \"calendar-edit-outline\",\n \"calendar-end\",\n \"calendar-end-outline\",\n \"calendar-expand-horizontal\",\n \"calendar-expand-horizontal-outline\",\n \"calendar-export\",\n \"calendar-export-outline\",\n \"calendar-filter\",\n \"calendar-filter-outline\",\n \"calendar-heart\",\n \"calendar-heart-outline\",\n \"calendar-import\",\n \"calendar-import-outline\",\n \"calendar-lock\",\n \"calendar-lock-open\",\n \"calendar-lock-open-outline\",\n \"calendar-lock-outline\",\n \"calendar-minus\",\n \"calendar-minus-outline\",\n \"calendar-month\",\n \"calendar-month-outline\",\n \"calendar-multiple\",\n \"calendar-multiple-check\",\n \"calendar-multiselect\",\n \"calendar-multiselect-outline\",\n \"calendar-outline\",\n \"calendar-plus\",\n \"calendar-plus-outline\",\n \"calendar-question\",\n \"calendar-question-outline\",\n \"calendar-range\",\n \"calendar-range-outline\",\n \"calendar-refresh\",\n \"calendar-refresh-outline\",\n \"calendar-remove\",\n \"calendar-remove-outline\",\n \"calendar-search\",\n \"calendar-search-outline\",\n \"calendar-star\",\n \"calendar-star-four-points\",\n \"calendar-star-outline\",\n \"calendar-start\",\n \"calendar-start-outline\",\n \"calendar-sync\",\n \"calendar-sync-outline\",\n \"calendar-text\",\n \"calendar-text-outline\",\n \"calendar-today\",\n \"calendar-today-outline\",\n \"calendar-week\",\n \"calendar-week-begin\",\n \"calendar-week-begin-outline\",\n \"calendar-week-outline\",\n \"calendar-weekend\",\n \"calendar-weekend-outline\",\n \"call-made\",\n \"call-merge\",\n \"call-missed\",\n \"call-received\",\n \"call-split\",\n \"camcorder\",\n \"camcorder-off\",\n \"camera\",\n \"camera-account\",\n \"camera-burst\",\n \"camera-control\",\n \"camera-document\",\n \"camera-document-off\",\n \"camera-enhance\",\n \"camera-enhance-outline\",\n \"camera-flip\",\n \"camera-flip-outline\",\n \"camera-front\",\n \"camera-front-variant\",\n \"camera-gopro\",\n \"camera-image\",\n \"camera-iris\",\n \"camera-lock\",\n \"camera-lock-open\",\n \"camera-lock-open-outline\",\n \"camera-lock-outline\",\n \"camera-marker\",\n \"camera-marker-outline\",\n \"camera-metering-center\",\n \"camera-metering-matrix\",\n \"camera-metering-partial\",\n \"camera-metering-spot\",\n \"camera-off\",\n \"camera-off-outline\",\n \"camera-outline\",\n \"camera-party-mode\",\n \"camera-plus\",\n \"camera-plus-outline\",\n \"camera-rear\",\n \"camera-rear-variant\",\n \"camera-retake\",\n \"camera-retake-outline\",\n \"camera-switch\",\n \"camera-switch-outline\",\n \"camera-timer\",\n \"camera-wireless\",\n \"camera-wireless-outline\",\n \"campfire\",\n \"cancel\",\n \"candelabra\",\n \"candelabra-fire\",\n \"candle\",\n \"candy\",\n \"candy-off\",\n \"candy-off-outline\",\n \"candy-outline\",\n \"candycane\",\n \"cannabis\",\n \"cannabis-off\",\n \"caps-lock\",\n \"car\",\n \"car-2-plus\",\n \"car-3-plus\",\n \"car-arrow-left\",\n \"car-arrow-right\",\n \"car-back\",\n \"car-battery\",\n \"car-brake-abs\",\n \"car-brake-alert\",\n \"car-brake-fluid-level\",\n \"car-brake-hold\",\n \"car-brake-low-pressure\",\n \"car-brake-parking\",\n \"car-brake-retarder\",\n \"car-brake-temperature\",\n \"car-brake-worn-linings\",\n \"car-child-seat\",\n \"car-clock\",\n \"car-clutch\",\n \"car-cog\",\n \"car-connected\",\n \"car-convertible\",\n \"car-coolant-level\",\n \"car-cruise-control\",\n \"car-defrost-front\",\n \"car-defrost-rear\",\n \"car-door\",\n \"car-door-lock\",\n \"car-door-lock-open\",\n \"car-electric\",\n \"car-electric-outline\",\n \"car-emergency\",\n \"car-esp\",\n \"car-estate\",\n \"car-hatchback\",\n \"car-info\",\n \"car-key\",\n \"car-lifted-pickup\",\n \"car-light-alert\",\n \"car-light-dimmed\",\n \"car-light-fog\",\n \"car-light-high\",\n \"car-limousine\",\n \"car-multiple\",\n \"car-off\",\n \"car-outline\",\n \"car-parking-lights\",\n \"car-pickup\",\n \"car-search\",\n \"car-search-outline\",\n \"car-seat\",\n \"car-seat-cooler\",\n \"car-seat-heater\",\n \"car-select\",\n \"car-settings\",\n \"car-shift-pattern\",\n \"car-side\",\n \"car-speed-limiter\",\n \"car-sports\",\n \"car-tire-alert\",\n \"car-traction-control\",\n \"car-turbocharger\",\n \"car-wash\",\n \"car-windshield\",\n \"car-windshield-outline\",\n \"car-wireless\",\n \"car-wrench\",\n \"carabiner\",\n \"caravan\",\n \"card\",\n \"card-account-details\",\n \"card-account-details-outline\",\n \"card-account-details-star\",\n \"card-account-details-star-outline\",\n \"card-account-mail\",\n \"card-account-mail-outline\",\n \"card-account-phone\",\n \"card-account-phone-outline\",\n \"card-bulleted\",\n \"card-bulleted-off\",\n \"card-bulleted-off-outline\",\n \"card-bulleted-outline\",\n \"card-bulleted-settings\",\n \"card-bulleted-settings-outline\",\n \"card-minus\",\n \"card-minus-outline\",\n \"card-multiple\",\n \"card-multiple-outline\",\n \"card-off\",\n \"card-off-outline\",\n \"card-outline\",\n \"card-plus\",\n \"card-plus-outline\",\n \"card-remove\",\n \"card-remove-outline\",\n \"card-search\",\n \"card-search-outline\",\n \"card-text\",\n \"card-text-outline\",\n \"cards\",\n \"cards-club\",\n \"cards-club-outline\",\n \"cards-diamond\",\n \"cards-diamond-outline\",\n \"cards-heart\",\n \"cards-heart-outline\",\n \"cards-outline\",\n \"cards-playing\",\n \"cards-playing-club\",\n \"cards-playing-club-multiple\",\n \"cards-playing-club-multiple-outline\",\n \"cards-playing-club-outline\",\n \"cards-playing-diamond\",\n \"cards-playing-diamond-multiple\",\n \"cards-playing-diamond-multiple-outline\",\n \"cards-playing-diamond-outline\",\n \"cards-playing-heart\",\n \"cards-playing-heart-multiple\",\n \"cards-playing-heart-multiple-outline\",\n \"cards-playing-heart-outline\",\n \"cards-playing-outline\",\n \"cards-playing-spade\",\n \"cards-playing-spade-multiple\",\n \"cards-playing-spade-multiple-outline\",\n \"cards-playing-spade-outline\",\n \"cards-spade\",\n \"cards-spade-outline\",\n \"cards-variant\",\n \"carrot\",\n \"cart\",\n \"cart-arrow-down\",\n \"cart-arrow-right\",\n \"cart-arrow-up\",\n \"cart-check\",\n \"cart-heart\",\n \"cart-minus\",\n \"cart-off\",\n \"cart-outline\",\n \"cart-percent\",\n \"cart-plus\",\n \"cart-remove\",\n \"cart-variant\",\n \"case-sensitive-alt\",\n \"cash\",\n \"cash-100\",\n \"cash-check\",\n \"cash-clock\",\n \"cash-edit\",\n \"cash-fast\",\n \"cash-lock\",\n \"cash-lock-open\",\n \"cash-marker\",\n \"cash-minus\",\n \"cash-multiple\",\n \"cash-off\",\n \"cash-plus\",\n \"cash-refund\",\n \"cash-register\",\n \"cash-remove\",\n \"cash-sync\",\n \"cassette\",\n \"cast\",\n \"cast-audio\",\n \"cast-audio-variant\",\n \"cast-connected\",\n \"cast-education\",\n \"cast-off\",\n \"cast-variant\",\n \"castle\",\n \"cat\",\n \"cctv\",\n \"cctv-off\",\n \"ceiling-fan\",\n \"ceiling-fan-light\",\n \"ceiling-light\",\n \"ceiling-light-multiple\",\n \"ceiling-light-multiple-outline\",\n \"ceiling-light-outline\",\n \"cellphone\",\n \"cellphone-arrow-down\",\n \"cellphone-arrow-down-variant\",\n \"cellphone-basic\",\n \"cellphone-charging\",\n \"cellphone-check\",\n \"cellphone-cog\",\n \"cellphone-dock\",\n \"cellphone-information\",\n \"cellphone-key\",\n \"cellphone-link\",\n \"cellphone-link-off\",\n \"cellphone-lock\",\n \"cellphone-marker\",\n \"cellphone-message\",\n \"cellphone-message-off\",\n \"cellphone-nfc\",\n \"cellphone-nfc-off\",\n \"cellphone-off\",\n \"cellphone-play\",\n \"cellphone-remove\",\n \"cellphone-screenshot\",\n \"cellphone-settings\",\n \"cellphone-sound\",\n \"cellphone-text\",\n \"cellphone-wireless\",\n \"centos\",\n \"certificate\",\n \"certificate-outline\",\n \"chair-rolling\",\n \"chair-school\",\n \"chandelier\",\n \"charity\",\n \"charity-search\",\n \"chart-arc\",\n \"chart-areaspline\",\n \"chart-areaspline-variant\",\n \"chart-bar\",\n \"chart-bar-stacked\",\n \"chart-bell-curve\",\n \"chart-bell-curve-cumulative\",\n \"chart-box\",\n \"chart-box-multiple\",\n \"chart-box-multiple-outline\",\n \"chart-box-outline\",\n \"chart-box-plus-outline\",\n \"chart-bubble\",\n \"chart-donut\",\n \"chart-donut-variant\",\n \"chart-gantt\",\n \"chart-histogram\",\n \"chart-line\",\n \"chart-line-stacked\",\n \"chart-line-variant\",\n \"chart-multiline\",\n \"chart-multiple\",\n \"chart-pie\",\n \"chart-pie-outline\",\n \"chart-ppf\",\n \"chart-sankey\",\n \"chart-sankey-variant\",\n \"chart-scatter-plot\",\n \"chart-scatter-plot-hexbin\",\n \"chart-timeline\",\n \"chart-timeline-variant\",\n \"chart-timeline-variant-shimmer\",\n \"chart-tree\",\n \"chart-waterfall\",\n \"chat\",\n \"chat-alert\",\n \"chat-alert-outline\",\n \"chat-minus\",\n \"chat-minus-outline\",\n \"chat-outline\",\n \"chat-plus\",\n \"chat-plus-outline\",\n \"chat-processing\",\n \"chat-processing-outline\",\n \"chat-question\",\n \"chat-question-outline\",\n \"chat-remove\",\n \"chat-remove-outline\",\n \"chat-sleep\",\n \"chat-sleep-outline\",\n \"check\",\n \"check-all\",\n \"check-bold\",\n \"check-circle\",\n \"check-circle-outline\",\n \"check-decagram\",\n \"check-decagram-outline\",\n \"check-network\",\n \"check-network-outline\",\n \"check-outline\",\n \"check-underline\",\n \"check-underline-circle\",\n \"check-underline-circle-outline\",\n \"checkbook\",\n \"checkbook-arrow-left\",\n \"checkbook-arrow-right\",\n \"checkbox-blank\",\n \"checkbox-blank-badge\",\n \"checkbox-blank-badge-outline\",\n \"checkbox-blank-circle\",\n \"checkbox-blank-circle-outline\",\n \"checkbox-blank-off\",\n \"checkbox-blank-off-outline\",\n \"checkbox-blank-outline\",\n \"checkbox-intermediate\",\n \"checkbox-intermediate-variant\",\n \"checkbox-marked\",\n \"checkbox-marked-circle\",\n \"checkbox-marked-circle-auto-outline\",\n \"checkbox-marked-circle-minus-outline\",\n \"checkbox-marked-circle-outline\",\n \"checkbox-marked-circle-plus-outline\",\n \"checkbox-marked-outline\",\n \"checkbox-multiple-blank\",\n \"checkbox-multiple-blank-circle\",\n \"checkbox-multiple-blank-circle-outline\",\n \"checkbox-multiple-blank-outline\",\n \"checkbox-multiple-marked\",\n \"checkbox-multiple-marked-circle\",\n \"checkbox-multiple-marked-circle-outline\",\n \"checkbox-multiple-marked-outline\",\n \"checkbox-multiple-outline\",\n \"checkbox-outline\",\n \"checkerboard\",\n \"checkerboard-minus\",\n \"checkerboard-plus\",\n \"checkerboard-remove\",\n \"cheese\",\n \"cheese-off\",\n \"chef-hat\",\n \"chemical-weapon\",\n \"chess-bishop\",\n \"chess-king\",\n \"chess-knight\",\n \"chess-pawn\",\n \"chess-queen\",\n \"chess-rook\",\n \"chevron-double-down\",\n \"chevron-double-left\",\n \"chevron-double-right\",\n \"chevron-double-up\",\n \"chevron-down\",\n \"chevron-down-box\",\n \"chevron-down-box-outline\",\n \"chevron-down-circle\",\n \"chevron-down-circle-outline\",\n \"chevron-left\",\n \"chevron-left-box\",\n \"chevron-left-box-outline\",\n \"chevron-left-circle\",\n \"chevron-left-circle-outline\",\n \"chevron-right\",\n \"chevron-right-box\",\n \"chevron-right-box-outline\",\n \"chevron-right-circle\",\n \"chevron-right-circle-outline\",\n \"chevron-triple-down\",\n \"chevron-triple-left\",\n \"chevron-triple-right\",\n \"chevron-triple-up\",\n \"chevron-up\",\n \"chevron-up-box\",\n \"chevron-up-box-outline\",\n \"chevron-up-circle\",\n \"chevron-up-circle-outline\",\n \"chili-alert\",\n \"chili-alert-outline\",\n \"chili-hot\",\n \"chili-hot-outline\",\n \"chili-medium\",\n \"chili-medium-outline\",\n \"chili-mild\",\n \"chili-mild-outline\",\n \"chili-off\",\n \"chili-off-outline\",\n \"chip\",\n \"church\",\n \"church-outline\",\n \"cigar\",\n \"cigar-off\",\n \"circle\",\n \"circle-box\",\n \"circle-box-outline\",\n \"circle-double\",\n \"circle-edit-outline\",\n \"circle-expand\",\n \"circle-half\",\n \"circle-half-full\",\n \"circle-medium\",\n \"circle-multiple\",\n \"circle-multiple-outline\",\n \"circle-off-outline\",\n \"circle-opacity\",\n \"circle-outline\",\n \"circle-slice-1\",\n \"circle-slice-2\",\n \"circle-slice-3\",\n \"circle-slice-4\",\n \"circle-slice-5\",\n \"circle-slice-6\",\n \"circle-slice-7\",\n \"circle-slice-8\",\n \"circle-small\",\n \"circular-saw\",\n \"city\",\n \"city-switch\",\n \"city-variant\",\n \"city-variant-outline\",\n \"clipboard\",\n \"clipboard-account\",\n \"clipboard-account-outline\",\n \"clipboard-alert\",\n \"clipboard-alert-outline\",\n \"clipboard-arrow-down\",\n \"clipboard-arrow-down-outline\",\n \"clipboard-arrow-left\",\n \"clipboard-arrow-left-outline\",\n \"clipboard-arrow-right\",\n \"clipboard-arrow-right-outline\",\n \"clipboard-arrow-up\",\n \"clipboard-arrow-up-outline\",\n \"clipboard-check\",\n \"clipboard-check-multiple\",\n \"clipboard-check-multiple-outline\",\n \"clipboard-check-outline\",\n \"clipboard-clock\",\n \"clipboard-clock-outline\",\n \"clipboard-edit\",\n \"clipboard-edit-outline\",\n \"clipboard-file\",\n \"clipboard-file-outline\",\n \"clipboard-flow\",\n \"clipboard-flow-outline\",\n \"clipboard-list\",\n \"clipboard-list-outline\",\n \"clipboard-minus\",\n \"clipboard-minus-outline\",\n \"clipboard-multiple\",\n \"clipboard-multiple-outline\",\n \"clipboard-off\",\n \"clipboard-off-outline\",\n \"clipboard-outline\",\n \"clipboard-play\",\n \"clipboard-play-multiple\",\n \"clipboard-play-multiple-outline\",\n \"clipboard-play-outline\",\n \"clipboard-plus\",\n \"clipboard-plus-outline\",\n \"clipboard-pulse\",\n \"clipboard-pulse-outline\",\n \"clipboard-remove\",\n \"clipboard-remove-outline\",\n \"clipboard-search\",\n \"clipboard-search-outline\",\n \"clipboard-text\",\n \"clipboard-text-clock\",\n \"clipboard-text-clock-outline\",\n \"clipboard-text-multiple\",\n \"clipboard-text-multiple-outline\",\n \"clipboard-text-off\",\n \"clipboard-text-off-outline\",\n \"clipboard-text-outline\",\n \"clipboard-text-play\",\n \"clipboard-text-play-outline\",\n \"clipboard-text-search\",\n \"clipboard-text-search-outline\",\n \"clippy\",\n \"clock\",\n \"clock-alert\",\n \"clock-alert-outline\",\n \"clock-check\",\n \"clock-check-outline\",\n \"clock-digital\",\n \"clock-edit\",\n \"clock-edit-outline\",\n \"clock-end\",\n \"clock-fast\",\n \"clock-in\",\n \"clock-minus\",\n \"clock-minus-outline\",\n \"clock-out\",\n \"clock-outline\",\n \"clock-plus\",\n \"clock-plus-outline\",\n \"clock-remove\",\n \"clock-remove-outline\",\n \"clock-star-four-points\",\n \"clock-star-four-points-outline\",\n \"clock-start\",\n \"clock-time-eight\",\n \"clock-time-eight-outline\",\n \"clock-time-eleven\",\n \"clock-time-eleven-outline\",\n \"clock-time-five\",\n \"clock-time-five-outline\",\n \"clock-time-four\",\n \"clock-time-four-outline\",\n \"clock-time-nine\",\n \"clock-time-nine-outline\",\n \"clock-time-one\",\n \"clock-time-one-outline\",\n \"clock-time-seven\",\n \"clock-time-seven-outline\",\n \"clock-time-six\",\n \"clock-time-six-outline\",\n \"clock-time-ten\",\n \"clock-time-ten-outline\",\n \"clock-time-three\",\n \"clock-time-three-outline\",\n \"clock-time-twelve\",\n \"clock-time-twelve-outline\",\n \"clock-time-two\",\n \"clock-time-two-outline\",\n \"close\",\n \"close-box\",\n \"close-box-multiple\",\n \"close-box-multiple-outline\",\n \"close-box-outline\",\n \"close-circle\",\n \"close-circle-multiple\",\n \"close-circle-multiple-outline\",\n \"close-circle-outline\",\n \"close-network\",\n \"close-network-outline\",\n \"close-octagon\",\n \"close-octagon-outline\",\n \"close-outline\",\n \"close-thick\",\n \"closed-caption\",\n \"closed-caption-outline\",\n \"cloud\",\n \"cloud-alert\",\n \"cloud-alert-outline\",\n \"cloud-arrow-down\",\n \"cloud-arrow-down-outline\",\n \"cloud-arrow-left\",\n \"cloud-arrow-left-outline\",\n \"cloud-arrow-right\",\n \"cloud-arrow-right-outline\",\n \"cloud-arrow-up\",\n \"cloud-arrow-up-outline\",\n \"cloud-braces\",\n \"cloud-cancel\",\n \"cloud-cancel-outline\",\n \"cloud-check\",\n \"cloud-check-outline\",\n \"cloud-check-variant\",\n \"cloud-check-variant-outline\",\n \"cloud-circle\",\n \"cloud-circle-outline\",\n \"cloud-clock\",\n \"cloud-clock-outline\",\n \"cloud-cog\",\n \"cloud-cog-outline\",\n \"cloud-download\",\n \"cloud-download-outline\",\n \"cloud-key\",\n \"cloud-key-outline\",\n \"cloud-lock\",\n \"cloud-lock-open\",\n \"cloud-lock-open-outline\",\n \"cloud-lock-outline\",\n \"cloud-minus\",\n \"cloud-minus-outline\",\n \"cloud-off\",\n \"cloud-off-outline\",\n \"cloud-outline\",\n \"cloud-percent\",\n \"cloud-percent-outline\",\n \"cloud-plus\",\n \"cloud-plus-outline\",\n \"cloud-print\",\n \"cloud-print-outline\",\n \"cloud-question\",\n \"cloud-question-outline\",\n \"cloud-refresh\",\n \"cloud-refresh-outline\",\n \"cloud-refresh-variant\",\n \"cloud-refresh-variant-outline\",\n \"cloud-remove\",\n \"cloud-remove-outline\",\n \"cloud-search\",\n \"cloud-search-outline\",\n \"cloud-sync\",\n \"cloud-sync-outline\",\n \"cloud-tags\",\n \"cloud-upload\",\n \"cloud-upload-outline\",\n \"clouds\",\n \"clover\",\n \"clover-outline\",\n \"coach-lamp\",\n \"coach-lamp-variant\",\n \"coat-rack\",\n \"code-array\",\n \"code-block-braces\",\n \"code-block-brackets\",\n \"code-block-parentheses\",\n \"code-block-tags\",\n \"code-braces\",\n \"code-braces-box\",\n \"code-brackets\",\n \"code-equal\",\n \"code-greater-than\",\n \"code-greater-than-or-equal\",\n \"code-json\",\n \"code-less-than\",\n \"code-less-than-or-equal\",\n \"code-not-equal\",\n \"code-not-equal-variant\",\n \"code-parentheses\",\n \"code-parentheses-box\",\n \"code-string\",\n \"code-tags\",\n \"code-tags-check\",\n \"codepen\",\n \"coffee\",\n \"coffee-maker\",\n \"coffee-maker-check\",\n \"coffee-maker-check-outline\",\n \"coffee-maker-outline\",\n \"coffee-off\",\n \"coffee-off-outline\",\n \"coffee-outline\",\n \"coffee-to-go\",\n \"coffee-to-go-outline\",\n \"coffin\",\n \"cog\",\n \"cog-box\",\n \"cog-clockwise\",\n \"cog-counterclockwise\",\n \"cog-off\",\n \"cog-off-outline\",\n \"cog-outline\",\n \"cog-pause\",\n \"cog-pause-outline\",\n \"cog-play\",\n \"cog-play-outline\",\n \"cog-refresh\",\n \"cog-refresh-outline\",\n \"cog-stop\",\n \"cog-stop-outline\",\n \"cog-sync\",\n \"cog-sync-outline\",\n \"cog-transfer\",\n \"cog-transfer-outline\",\n \"cogs\",\n \"collage\",\n \"collapse-all\",\n \"collapse-all-outline\",\n \"color-helper\",\n \"comma\",\n \"comma-box\",\n \"comma-box-outline\",\n \"comma-circle\",\n \"comma-circle-outline\",\n \"comment\",\n \"comment-account\",\n \"comment-account-outline\",\n \"comment-alert\",\n \"comment-alert-outline\",\n \"comment-arrow-left\",\n \"comment-arrow-left-outline\",\n \"comment-arrow-right\",\n \"comment-arrow-right-outline\",\n \"comment-bookmark\",\n \"comment-bookmark-outline\",\n \"comment-check\",\n \"comment-check-outline\",\n \"comment-edit\",\n \"comment-edit-outline\",\n \"comment-eye\",\n \"comment-eye-outline\",\n \"comment-flash\",\n \"comment-flash-outline\",\n \"comment-minus\",\n \"comment-minus-outline\",\n \"comment-multiple\",\n \"comment-multiple-outline\",\n \"comment-off\",\n \"comment-off-outline\",\n \"comment-outline\",\n \"comment-plus\",\n \"comment-plus-outline\",\n \"comment-processing\",\n \"comment-processing-outline\",\n \"comment-question\",\n \"comment-question-outline\",\n \"comment-quote\",\n \"comment-quote-outline\",\n \"comment-remove\",\n \"comment-remove-outline\",\n \"comment-search\",\n \"comment-search-outline\",\n \"comment-text\",\n \"comment-text-multiple\",\n \"comment-text-multiple-outline\",\n \"comment-text-outline\",\n \"compare\",\n \"compare-horizontal\",\n \"compare-remove\",\n \"compare-vertical\",\n \"compass\",\n \"compass-off\",\n \"compass-off-outline\",\n \"compass-outline\",\n \"compass-rose\",\n \"compost\",\n \"cone\",\n \"cone-off\",\n \"connection\",\n \"console\",\n \"console-line\",\n \"console-network\",\n \"console-network-outline\",\n \"consolidate\",\n \"contactless-payment\",\n \"contactless-payment-circle\",\n \"contactless-payment-circle-outline\",\n \"contacts\",\n \"contacts-outline\",\n \"contain\",\n \"contain-end\",\n \"contain-start\",\n \"content-copy\",\n \"content-cut\",\n \"content-duplicate\",\n \"content-paste\",\n \"content-save\",\n \"content-save-alert\",\n \"content-save-alert-outline\",\n \"content-save-all\",\n \"content-save-all-outline\",\n \"content-save-check\",\n \"content-save-check-outline\",\n \"content-save-cog\",\n \"content-save-cog-outline\",\n \"content-save-edit\",\n \"content-save-edit-outline\",\n \"content-save-minus\",\n \"content-save-minus-outline\",\n \"content-save-move\",\n \"content-save-move-outline\",\n \"content-save-off\",\n \"content-save-off-outline\",\n \"content-save-outline\",\n \"content-save-plus\",\n \"content-save-plus-outline\",\n \"content-save-settings\",\n \"content-save-settings-outline\",\n \"contrast\",\n \"contrast-box\",\n \"contrast-circle\",\n \"controller\",\n \"controller-classic\",\n \"controller-classic-outline\",\n \"controller-off\",\n \"cookie\",\n \"cookie-alert\",\n \"cookie-alert-outline\",\n \"cookie-check\",\n \"cookie-check-outline\",\n \"cookie-clock\",\n \"cookie-clock-outline\",\n \"cookie-cog\",\n \"cookie-cog-outline\",\n \"cookie-edit\",\n \"cookie-edit-outline\",\n \"cookie-lock\",\n \"cookie-lock-outline\",\n \"cookie-minus\",\n \"cookie-minus-outline\",\n \"cookie-off\",\n \"cookie-off-outline\",\n \"cookie-outline\",\n \"cookie-plus\",\n \"cookie-plus-outline\",\n \"cookie-refresh\",\n \"cookie-refresh-outline\",\n \"cookie-remove\",\n \"cookie-remove-outline\",\n \"cookie-settings\",\n \"cookie-settings-outline\",\n \"coolant-temperature\",\n \"copyleft\",\n \"copyright\",\n \"cordova\",\n \"corn\",\n \"corn-off\",\n \"cosine-wave\",\n \"counter\",\n \"countertop\",\n \"countertop-outline\",\n \"cow\",\n \"cow-off\",\n \"cpu-32-bit\",\n \"cpu-64-bit\",\n \"cradle\",\n \"cradle-outline\",\n \"crane\",\n \"creation\",\n \"creation-outline\",\n \"creative-commons\",\n \"credit-card\",\n \"credit-card-check\",\n \"credit-card-check-outline\",\n \"credit-card-chip\",\n \"credit-card-chip-outline\",\n \"credit-card-clock\",\n \"credit-card-clock-outline\",\n \"credit-card-edit\",\n \"credit-card-edit-outline\",\n \"credit-card-fast\",\n \"credit-card-fast-outline\",\n \"credit-card-lock\",\n \"credit-card-lock-outline\",\n \"credit-card-marker\",\n \"credit-card-marker-outline\",\n \"credit-card-minus\",\n \"credit-card-minus-outline\",\n \"credit-card-multiple\",\n \"credit-card-multiple-outline\",\n \"credit-card-off\",\n \"credit-card-off-outline\",\n \"credit-card-outline\",\n \"credit-card-plus\",\n \"credit-card-plus-outline\",\n \"credit-card-refresh\",\n \"credit-card-refresh-outline\",\n \"credit-card-refund\",\n \"credit-card-refund-outline\",\n \"credit-card-remove\",\n \"credit-card-remove-outline\",\n \"credit-card-scan\",\n \"credit-card-scan-outline\",\n \"credit-card-search\",\n \"credit-card-search-outline\",\n \"credit-card-settings\",\n \"credit-card-settings-outline\",\n \"credit-card-sync\",\n \"credit-card-sync-outline\",\n \"credit-card-wireless\",\n \"credit-card-wireless-off\",\n \"credit-card-wireless-off-outline\",\n \"credit-card-wireless-outline\",\n \"cricket\",\n \"crop\",\n \"crop-free\",\n \"crop-landscape\",\n \"crop-portrait\",\n \"crop-rotate\",\n \"crop-square\",\n \"cross\",\n \"cross-bolnisi\",\n \"cross-celtic\",\n \"cross-outline\",\n \"crosshairs\",\n \"crosshairs-gps\",\n \"crosshairs-off\",\n \"crosshairs-question\",\n \"crowd\",\n \"crown\",\n \"crown-circle\",\n \"crown-circle-outline\",\n \"crown-outline\",\n \"cryengine\",\n \"crystal-ball\",\n \"cube\",\n \"cube-off\",\n \"cube-off-outline\",\n \"cube-outline\",\n \"cube-scan\",\n \"cube-send\",\n \"cube-unfolded\",\n \"cup\",\n \"cup-off\",\n \"cup-off-outline\",\n \"cup-outline\",\n \"cup-water\",\n \"cupboard\",\n \"cupboard-outline\",\n \"cupcake\",\n \"curling\",\n \"currency-bdt\",\n \"currency-brl\",\n \"currency-btc\",\n \"currency-cny\",\n \"currency-eth\",\n \"currency-eur\",\n \"currency-eur-off\",\n \"currency-fra\",\n \"currency-gbp\",\n \"currency-ils\",\n \"currency-inr\",\n \"currency-jpy\",\n \"currency-krw\",\n \"currency-kzt\",\n \"currency-mnt\",\n \"currency-ngn\",\n \"currency-php\",\n \"currency-rial\",\n \"currency-rub\",\n \"currency-rupee\",\n \"currency-sign\",\n \"currency-thb\",\n \"currency-try\",\n \"currency-twd\",\n \"currency-uah\",\n \"currency-usd\",\n \"currency-usd-off\",\n \"current-ac\",\n \"current-dc\",\n \"cursor-default\",\n \"cursor-default-click\",\n \"cursor-default-click-outline\",\n \"cursor-default-gesture\",\n \"cursor-default-gesture-outline\",\n \"cursor-default-outline\",\n \"cursor-move\",\n \"cursor-pointer\",\n \"cursor-text\",\n \"curtains\",\n \"curtains-closed\",\n \"cylinder\",\n \"cylinder-off\",\n \"dance-ballroom\",\n \"dance-pole\",\n \"data-matrix\",\n \"data-matrix-edit\",\n \"data-matrix-minus\",\n \"data-matrix-plus\",\n \"data-matrix-remove\",\n \"data-matrix-scan\",\n \"database\",\n \"database-alert\",\n \"database-alert-outline\",\n \"database-arrow-down\",\n \"database-arrow-down-outline\",\n \"database-arrow-left\",\n \"database-arrow-left-outline\",\n \"database-arrow-right\",\n \"database-arrow-right-outline\",\n \"database-arrow-up\",\n \"database-arrow-up-outline\",\n \"database-check\",\n \"database-check-outline\",\n \"database-clock\",\n \"database-clock-outline\",\n \"database-cog\",\n \"database-cog-outline\",\n \"database-edit\",\n \"database-edit-outline\",\n \"database-export\",\n \"database-export-outline\",\n \"database-eye\",\n \"database-eye-off\",\n \"database-eye-off-outline\",\n \"database-eye-outline\",\n \"database-import\",\n \"database-import-outline\",\n \"database-lock\",\n \"database-lock-outline\",\n \"database-marker\",\n \"database-marker-outline\",\n \"database-minus\",\n \"database-minus-outline\",\n \"database-off\",\n \"database-off-outline\",\n \"database-outline\",\n \"database-plus\",\n \"database-plus-outline\",\n \"database-refresh\",\n \"database-refresh-outline\",\n \"database-remove\",\n \"database-remove-outline\",\n \"database-search\",\n \"database-search-outline\",\n \"database-settings\",\n \"database-settings-outline\",\n \"database-sync\",\n \"database-sync-outline\",\n \"death-star\",\n \"death-star-variant\",\n \"deathly-hallows\",\n \"debian\",\n \"debug-step-into\",\n \"debug-step-out\",\n \"debug-step-over\",\n \"decagram\",\n \"decagram-outline\",\n \"decimal\",\n \"decimal-comma\",\n \"decimal-comma-decrease\",\n \"decimal-comma-increase\",\n \"decimal-decrease\",\n \"decimal-increase\",\n \"delete\",\n \"delete-alert\",\n \"delete-alert-outline\",\n \"delete-circle\",\n \"delete-circle-outline\",\n \"delete-clock\",\n \"delete-clock-outline\",\n \"delete-empty\",\n \"delete-empty-outline\",\n \"delete-forever\",\n \"delete-forever-outline\",\n \"delete-off\",\n \"delete-off-outline\",\n \"delete-outline\",\n \"delete-restore\",\n \"delete-sweep\",\n \"delete-sweep-outline\",\n \"delete-variant\",\n \"delta\",\n \"desk\",\n \"desk-lamp\",\n \"desk-lamp-off\",\n \"desk-lamp-on\",\n \"deskphone\",\n \"desktop-classic\",\n \"desktop-tower\",\n \"desktop-tower-monitor\",\n \"details\",\n \"dev-to\",\n \"developer-board\",\n \"deviantart\",\n \"devices\",\n \"dharmachakra\",\n \"diabetes\",\n \"dialpad\",\n \"diameter\",\n \"diameter-outline\",\n \"diameter-variant\",\n \"diamond\",\n \"diamond-outline\",\n \"diamond-stone\",\n \"diaper-outline\",\n \"dice-1\",\n \"dice-1-outline\",\n \"dice-2\",\n \"dice-2-outline\",\n \"dice-3\",\n \"dice-3-outline\",\n \"dice-4\",\n \"dice-4-outline\",\n \"dice-5\",\n \"dice-5-outline\",\n \"dice-6\",\n \"dice-6-outline\",\n \"dice-d10\",\n \"dice-d10-outline\",\n \"dice-d12\",\n \"dice-d12-outline\",\n \"dice-d20\",\n \"dice-d20-outline\",\n \"dice-d4\",\n \"dice-d4-outline\",\n \"dice-d6\",\n \"dice-d6-outline\",\n \"dice-d8\",\n \"dice-d8-outline\",\n \"dice-multiple\",\n \"dice-multiple-outline\",\n \"digital-ocean\",\n \"dip-switch\",\n \"directions\",\n \"directions-fork\",\n \"disc\",\n \"disc-alert\",\n \"disc-player\",\n \"dishwasher\",\n \"dishwasher-alert\",\n \"dishwasher-off\",\n \"disqus\",\n \"distribute-horizontal-center\",\n \"distribute-horizontal-left\",\n \"distribute-horizontal-right\",\n \"distribute-vertical-bottom\",\n \"distribute-vertical-center\",\n \"distribute-vertical-top\",\n \"diversify\",\n \"diving\",\n \"diving-flippers\",\n \"diving-helmet\",\n \"diving-scuba\",\n \"diving-scuba-flag\",\n \"diving-scuba-mask\",\n \"diving-scuba-tank\",\n \"diving-scuba-tank-multiple\",\n \"diving-snorkel\",\n \"division\",\n \"division-box\",\n \"dlna\",\n \"dna\",\n \"dns\",\n \"dns-outline\",\n \"dock-bottom\",\n \"dock-left\",\n \"dock-right\",\n \"dock-top\",\n \"dock-window\",\n \"docker\",\n \"doctor\",\n \"dog\",\n \"dog-service\",\n \"dog-side\",\n \"dog-side-off\",\n \"dolby\",\n \"dolly\",\n \"dolphin\",\n \"domain\",\n \"domain-off\",\n \"domain-plus\",\n \"domain-remove\",\n \"domain-switch\",\n \"dome-light\",\n \"domino-mask\",\n \"donkey\",\n \"door\",\n \"door-closed\",\n \"door-closed-cancel\",\n \"door-closed-lock\",\n \"door-open\",\n \"door-sliding\",\n \"door-sliding-lock\",\n \"door-sliding-open\",\n \"doorbell\",\n \"doorbell-video\",\n \"dot-net\",\n \"dots-circle\",\n \"dots-grid\",\n \"dots-hexagon\",\n \"dots-horizontal\",\n \"dots-horizontal-circle\",\n \"dots-horizontal-circle-outline\",\n \"dots-square\",\n \"dots-triangle\",\n \"dots-vertical\",\n \"dots-vertical-circle\",\n \"dots-vertical-circle-outline\",\n \"download\",\n \"download-box\",\n \"download-box-outline\",\n \"download-circle\",\n \"download-circle-outline\",\n \"download-lock\",\n \"download-lock-outline\",\n \"download-multiple\",\n \"download-multiple-outline\",\n \"download-network\",\n \"download-network-outline\",\n \"download-off\",\n \"download-off-outline\",\n \"download-outline\",\n \"drag\",\n \"drag-horizontal\",\n \"drag-horizontal-variant\",\n \"drag-variant\",\n \"drag-vertical\",\n \"drag-vertical-variant\",\n \"drama-masks\",\n \"draw\",\n \"draw-pen\",\n \"drawing\",\n \"drawing-box\",\n \"dresser\",\n \"dresser-outline\",\n \"drone\",\n \"dropbox\",\n \"drupal\",\n \"duck\",\n \"dumbbell\",\n \"dump-truck\",\n \"ear-hearing\",\n \"ear-hearing-loop\",\n \"ear-hearing-off\",\n \"earbuds\",\n \"earbuds-off\",\n \"earbuds-off-outline\",\n \"earbuds-outline\",\n \"earth\",\n \"earth-arrow-down\",\n \"earth-arrow-left\",\n \"earth-arrow-right\",\n \"earth-arrow-up\",\n \"earth-box\",\n \"earth-box-minus\",\n \"earth-box-off\",\n \"earth-box-plus\",\n \"earth-box-remove\",\n \"earth-minus\",\n \"earth-off\",\n \"earth-plus\",\n \"earth-remove\",\n \"egg\",\n \"egg-easter\",\n \"egg-fried\",\n \"egg-off\",\n \"egg-off-outline\",\n \"egg-outline\",\n \"eiffel-tower\",\n \"eight-track\",\n \"eject\",\n \"eject-circle\",\n \"eject-circle-outline\",\n \"eject-outline\",\n \"electric-switch\",\n \"electric-switch-closed\",\n \"electron-framework\",\n \"elephant\",\n \"elevation-decline\",\n \"elevation-rise\",\n \"elevator\",\n \"elevator-down\",\n \"elevator-passenger\",\n \"elevator-passenger-off\",\n \"elevator-passenger-off-outline\",\n \"elevator-passenger-outline\",\n \"elevator-up\",\n \"ellipse\",\n \"ellipse-outline\",\n \"email\",\n \"email-alert\",\n \"email-alert-outline\",\n \"email-arrow-left\",\n \"email-arrow-left-outline\",\n \"email-arrow-right\",\n \"email-arrow-right-outline\",\n \"email-box\",\n \"email-check\",\n \"email-check-outline\",\n \"email-edit\",\n \"email-edit-outline\",\n \"email-fast\",\n \"email-fast-outline\",\n \"email-heart-outline\",\n \"email-lock\",\n \"email-lock-outline\",\n \"email-mark-as-unread\",\n \"email-minus\",\n \"email-minus-outline\",\n \"email-multiple\",\n \"email-multiple-outline\",\n \"email-newsletter\",\n \"email-off\",\n \"email-off-outline\",\n \"email-open\",\n \"email-open-heart-outline\",\n \"email-open-multiple\",\n \"email-open-multiple-outline\",\n \"email-open-outline\",\n \"email-outline\",\n \"email-plus\",\n \"email-plus-outline\",\n \"email-remove\",\n \"email-remove-outline\",\n \"email-seal\",\n \"email-seal-outline\",\n \"email-search\",\n \"email-search-outline\",\n \"email-sync\",\n \"email-sync-outline\",\n \"email-variant\",\n \"ember\",\n \"emby\",\n \"emoticon\",\n \"emoticon-angry\",\n \"emoticon-angry-outline\",\n \"emoticon-confused\",\n \"emoticon-confused-outline\",\n \"emoticon-cool\",\n \"emoticon-cool-outline\",\n \"emoticon-cry\",\n \"emoticon-cry-outline\",\n \"emoticon-dead\",\n \"emoticon-dead-outline\",\n \"emoticon-devil\",\n \"emoticon-devil-outline\",\n \"emoticon-excited\",\n \"emoticon-excited-outline\",\n \"emoticon-frown\",\n \"emoticon-frown-outline\",\n \"emoticon-happy\",\n \"emoticon-happy-outline\",\n \"emoticon-kiss\",\n \"emoticon-kiss-outline\",\n \"emoticon-lol\",\n \"emoticon-lol-outline\",\n \"emoticon-minus\",\n \"emoticon-minus-outline\",\n \"emoticon-neutral\",\n \"emoticon-neutral-outline\",\n \"emoticon-outline\",\n \"emoticon-plus\",\n \"emoticon-plus-outline\",\n \"emoticon-poop\",\n \"emoticon-poop-outline\",\n \"emoticon-remove\",\n \"emoticon-remove-outline\",\n \"emoticon-sad\",\n \"emoticon-sad-outline\",\n \"emoticon-sick\",\n \"emoticon-sick-outline\",\n \"emoticon-tongue\",\n \"emoticon-tongue-outline\",\n \"emoticon-wink\",\n \"emoticon-wink-outline\",\n \"engine\",\n \"engine-off\",\n \"engine-off-outline\",\n \"engine-outline\",\n \"epsilon\",\n \"equal\",\n \"equal-box\",\n \"equalizer\",\n \"equalizer-outline\",\n \"eraser\",\n \"eraser-variant\",\n \"escalator\",\n \"escalator-box\",\n \"escalator-down\",\n \"escalator-up\",\n \"eslint\",\n \"et\",\n \"ethereum\",\n \"ethernet\",\n \"ethernet-cable\",\n \"ethernet-cable-off\",\n \"ethernet-off\",\n \"ev-plug-ccs1\",\n \"ev-plug-ccs2\",\n \"ev-plug-chademo\",\n \"ev-plug-tesla\",\n \"ev-plug-type1\",\n \"ev-plug-type2\",\n \"ev-station\",\n \"evernote\",\n \"excavator\",\n \"exclamation\",\n \"exclamation-thick\",\n \"exit-run\",\n \"exit-to-app\",\n \"expand-all\",\n \"expand-all-outline\",\n \"expansion-card\",\n \"expansion-card-variant\",\n \"exponent\",\n \"exponent-box\",\n \"export\",\n \"export-variant\",\n \"eye\",\n \"eye-arrow-left\",\n \"eye-arrow-left-outline\",\n \"eye-arrow-right\",\n \"eye-arrow-right-outline\",\n \"eye-check\",\n \"eye-check-outline\",\n \"eye-circle\",\n \"eye-circle-outline\",\n \"eye-closed\",\n \"eye-lock\",\n \"eye-lock-open\",\n \"eye-lock-open-outline\",\n \"eye-lock-outline\",\n \"eye-minus\",\n \"eye-minus-outline\",\n \"eye-off\",\n \"eye-off-outline\",\n \"eye-outline\",\n \"eye-plus\",\n \"eye-plus-outline\",\n \"eye-refresh\",\n \"eye-refresh-outline\",\n \"eye-remove\",\n \"eye-remove-outline\",\n \"eye-settings\",\n \"eye-settings-outline\",\n \"eyedropper\",\n \"eyedropper-minus\",\n \"eyedropper-off\",\n \"eyedropper-plus\",\n \"eyedropper-remove\",\n \"eyedropper-variant\",\n \"face-agent\",\n \"face-man\",\n \"face-man-outline\",\n \"face-man-profile\",\n \"face-man-shimmer\",\n \"face-man-shimmer-outline\",\n \"face-mask\",\n \"face-mask-outline\",\n \"face-recognition\",\n \"face-woman\",\n \"face-woman-outline\",\n \"face-woman-profile\",\n \"face-woman-shimmer\",\n \"face-woman-shimmer-outline\",\n \"facebook\",\n \"facebook-gaming\",\n \"facebook-messenger\",\n \"facebook-workplace\",\n \"factory\",\n \"family-tree\",\n \"fan\",\n \"fan-alert\",\n \"fan-auto\",\n \"fan-chevron-down\",\n \"fan-chevron-up\",\n \"fan-clock\",\n \"fan-minus\",\n \"fan-off\",\n \"fan-plus\",\n \"fan-remove\",\n \"fan-speed-1\",\n \"fan-speed-2\",\n \"fan-speed-3\",\n \"fast-forward\",\n \"fast-forward-10\",\n \"fast-forward-15\",\n \"fast-forward-30\",\n \"fast-forward-45\",\n \"fast-forward-5\",\n \"fast-forward-60\",\n \"fast-forward-outline\",\n \"faucet\",\n \"faucet-variant\",\n \"fax\",\n \"feather\",\n \"feature-search\",\n \"feature-search-outline\",\n \"fedora\",\n \"fence\",\n \"fence-electric\",\n \"fencing\",\n \"ferris-wheel\",\n \"ferry\",\n \"file\",\n \"file-account\",\n \"file-account-outline\",\n \"file-alert\",\n \"file-alert-outline\",\n \"file-arrow-left-right\",\n \"file-arrow-left-right-outline\",\n \"file-arrow-up-down\",\n \"file-arrow-up-down-outline\",\n \"file-cabinet\",\n \"file-cad\",\n \"file-cad-box\",\n \"file-cancel\",\n \"file-cancel-outline\",\n \"file-certificate\",\n \"file-certificate-outline\",\n \"file-chart\",\n \"file-chart-check\",\n \"file-chart-check-outline\",\n \"file-chart-outline\",\n \"file-check\",\n \"file-check-outline\",\n \"file-clock\",\n \"file-clock-outline\",\n \"file-cloud\",\n \"file-cloud-outline\",\n \"file-code\",\n \"file-code-outline\",\n \"file-cog\",\n \"file-cog-outline\",\n \"file-compare\",\n \"file-delimited\",\n \"file-delimited-outline\",\n \"file-document\",\n \"file-document-alert\",\n \"file-document-alert-outline\",\n \"file-document-arrow-right\",\n \"file-document-arrow-right-outline\",\n \"file-document-check\",\n \"file-document-check-outline\",\n \"file-document-edit\",\n \"file-document-edit-outline\",\n \"file-document-minus\",\n \"file-document-minus-outline\",\n \"file-document-multiple\",\n \"file-document-multiple-outline\",\n \"file-document-outline\",\n \"file-document-plus\",\n \"file-document-plus-outline\",\n \"file-document-refresh\",\n \"file-document-refresh-outline\",\n \"file-document-remove\",\n \"file-document-remove-outline\",\n \"file-download\",\n \"file-download-outline\",\n \"file-edit\",\n \"file-edit-outline\",\n \"file-excel\",\n \"file-excel-box\",\n \"file-excel-box-outline\",\n \"file-excel-outline\",\n \"file-export\",\n \"file-export-outline\",\n \"file-eye\",\n \"file-eye-outline\",\n \"file-find\",\n \"file-find-outline\",\n \"file-gif-box\",\n \"file-hidden\",\n \"file-image\",\n \"file-image-marker\",\n \"file-image-marker-outline\",\n \"file-image-minus\",\n \"file-image-minus-outline\",\n \"file-image-outline\",\n \"file-image-plus\",\n \"file-image-plus-outline\",\n \"file-image-remove\",\n \"file-image-remove-outline\",\n \"file-import\",\n \"file-import-outline\",\n \"file-jpg-box\",\n \"file-key\",\n \"file-key-outline\",\n \"file-link\",\n \"file-link-outline\",\n \"file-lock\",\n \"file-lock-open\",\n \"file-lock-open-outline\",\n \"file-lock-outline\",\n \"file-marker\",\n \"file-marker-outline\",\n \"file-minus\",\n \"file-minus-outline\",\n \"file-move\",\n \"file-move-outline\",\n \"file-multiple\",\n \"file-multiple-outline\",\n \"file-music\",\n \"file-music-outline\",\n \"file-outline\",\n \"file-pdf-box\",\n \"file-percent\",\n \"file-percent-outline\",\n \"file-phone\",\n \"file-phone-outline\",\n \"file-plus\",\n \"file-plus-outline\",\n \"file-png-box\",\n \"file-powerpoint\",\n \"file-powerpoint-box\",\n \"file-powerpoint-box-outline\",\n \"file-powerpoint-outline\",\n \"file-presentation-box\",\n \"file-question\",\n \"file-question-outline\",\n \"file-refresh\",\n \"file-refresh-outline\",\n \"file-remove\",\n \"file-remove-outline\",\n \"file-replace\",\n \"file-replace-outline\",\n \"file-restore\",\n \"file-restore-outline\",\n \"file-rotate-left\",\n \"file-rotate-left-outline\",\n \"file-rotate-right\",\n \"file-rotate-right-outline\",\n \"file-search\",\n \"file-search-outline\",\n \"file-send\",\n \"file-send-outline\",\n \"file-settings\",\n \"file-settings-outline\",\n \"file-sign\",\n \"file-star\",\n \"file-star-four-points\",\n \"file-star-four-points-outline\",\n \"file-star-outline\",\n \"file-swap\",\n \"file-swap-outline\",\n \"file-sync\",\n \"file-sync-outline\",\n \"file-table\",\n \"file-table-box\",\n \"file-table-box-multiple\",\n \"file-table-box-multiple-outline\",\n \"file-table-box-outline\",\n \"file-table-outline\",\n \"file-tree\",\n \"file-tree-outline\",\n \"file-undo\",\n \"file-undo-outline\",\n \"file-upload\",\n \"file-upload-outline\",\n \"file-video\",\n \"file-video-outline\",\n \"file-word\",\n \"file-word-box\",\n \"file-word-box-outline\",\n \"file-word-outline\",\n \"file-xml-box\",\n \"film\",\n \"filmstrip\",\n \"filmstrip-box\",\n \"filmstrip-box-multiple\",\n \"filmstrip-off\",\n \"filter\",\n \"filter-check\",\n \"filter-check-outline\",\n \"filter-cog\",\n \"filter-cog-outline\",\n \"filter-menu\",\n \"filter-menu-outline\",\n \"filter-minus\",\n \"filter-minus-outline\",\n \"filter-multiple\",\n \"filter-multiple-outline\",\n \"filter-off\",\n \"filter-off-outline\",\n \"filter-outline\",\n \"filter-plus\",\n \"filter-plus-outline\",\n \"filter-remove\",\n \"filter-remove-outline\",\n \"filter-settings\",\n \"filter-settings-outline\",\n \"filter-variant\",\n \"filter-variant-minus\",\n \"filter-variant-plus\",\n \"filter-variant-remove\",\n \"finance\",\n \"find-replace\",\n \"fingerprint\",\n \"fingerprint-off\",\n \"fire\",\n \"fire-alert\",\n \"fire-circle\",\n \"fire-extinguisher\",\n \"fire-hydrant\",\n \"fire-hydrant-alert\",\n \"fire-hydrant-off\",\n \"fire-off\",\n \"fire-station\",\n \"fire-truck\",\n \"firebase\",\n \"firefox\",\n \"fireplace\",\n \"fireplace-off\",\n \"firewire\",\n \"firework\",\n \"firework-off\",\n \"fish\",\n \"fish-off\",\n \"fishbowl\",\n \"fishbowl-outline\",\n \"fit-to-page\",\n \"fit-to-page-outline\",\n \"fit-to-screen\",\n \"fit-to-screen-outline\",\n \"flag\",\n \"flag-checkered\",\n \"flag-minus\",\n \"flag-minus-outline\",\n \"flag-off\",\n \"flag-off-outline\",\n \"flag-outline\",\n \"flag-plus\",\n \"flag-plus-outline\",\n \"flag-remove\",\n \"flag-remove-outline\",\n \"flag-triangle\",\n \"flag-variant\",\n \"flag-variant-minus\",\n \"flag-variant-minus-outline\",\n \"flag-variant-off\",\n \"flag-variant-off-outline\",\n \"flag-variant-outline\",\n \"flag-variant-plus\",\n \"flag-variant-plus-outline\",\n \"flag-variant-remove\",\n \"flag-variant-remove-outline\",\n \"flare\",\n \"flash\",\n \"flash-alert\",\n \"flash-alert-outline\",\n \"flash-auto\",\n \"flash-off\",\n \"flash-off-outline\",\n \"flash-outline\",\n \"flash-red-eye\",\n \"flash-triangle\",\n \"flash-triangle-outline\",\n \"flashlight\",\n \"flashlight-off\",\n \"flask\",\n \"flask-empty\",\n \"flask-empty-minus\",\n \"flask-empty-minus-outline\",\n \"flask-empty-off\",\n \"flask-empty-off-outline\",\n \"flask-empty-outline\",\n \"flask-empty-plus\",\n \"flask-empty-plus-outline\",\n \"flask-empty-remove\",\n \"flask-empty-remove-outline\",\n \"flask-minus\",\n \"flask-minus-outline\",\n \"flask-off\",\n \"flask-off-outline\",\n \"flask-outline\",\n \"flask-plus\",\n \"flask-plus-outline\",\n \"flask-remove\",\n \"flask-remove-outline\",\n \"flask-round-bottom\",\n \"flask-round-bottom-empty\",\n \"flask-round-bottom-empty-outline\",\n \"flask-round-bottom-outline\",\n \"fleur-de-lis\",\n \"flip-horizontal\",\n \"flip-to-back\",\n \"flip-to-front\",\n \"flip-vertical\",\n \"floor-lamp\",\n \"floor-lamp-dual\",\n \"floor-lamp-dual-outline\",\n \"floor-lamp-outline\",\n \"floor-lamp-torchiere\",\n \"floor-lamp-torchiere-outline\",\n \"floor-lamp-torchiere-variant\",\n \"floor-lamp-torchiere-variant-outline\",\n \"floor-plan\",\n \"floppy\",\n \"floppy-variant\",\n \"flower\",\n \"flower-outline\",\n \"flower-pollen\",\n \"flower-pollen-outline\",\n \"flower-poppy\",\n \"flower-tulip\",\n \"flower-tulip-outline\",\n \"focus-auto\",\n \"focus-field\",\n \"focus-field-horizontal\",\n \"focus-field-vertical\",\n \"folder\",\n \"folder-account\",\n \"folder-account-outline\",\n \"folder-alert\",\n \"folder-alert-outline\",\n \"folder-arrow-down\",\n \"folder-arrow-down-outline\",\n \"folder-arrow-left\",\n \"folder-arrow-left-outline\",\n \"folder-arrow-left-right\",\n \"folder-arrow-left-right-outline\",\n \"folder-arrow-right\",\n \"folder-arrow-right-outline\",\n \"folder-arrow-up\",\n \"folder-arrow-up-down\",\n \"folder-arrow-up-down-outline\",\n \"folder-arrow-up-outline\",\n \"folder-cancel\",\n \"folder-cancel-outline\",\n \"folder-check\",\n \"folder-check-outline\",\n \"folder-clock\",\n \"folder-clock-outline\",\n \"folder-cog\",\n \"folder-cog-outline\",\n \"folder-download\",\n \"folder-download-outline\",\n \"folder-edit\",\n \"folder-edit-outline\",\n \"folder-eye\",\n \"folder-eye-outline\",\n \"folder-file\",\n \"folder-file-outline\",\n \"folder-google-drive\",\n \"folder-heart\",\n \"folder-heart-outline\",\n \"folder-hidden\",\n \"folder-home\",\n \"folder-home-outline\",\n \"folder-image\",\n \"folder-information\",\n \"folder-information-outline\",\n \"folder-key\",\n \"folder-key-network\",\n \"folder-key-network-outline\",\n \"folder-key-outline\",\n \"folder-lock\",\n \"folder-lock-open\",\n \"folder-lock-open-outline\",\n \"folder-lock-outline\",\n \"folder-marker\",\n \"folder-marker-outline\",\n \"folder-minus\",\n \"folder-minus-outline\",\n \"folder-move\",\n \"folder-move-outline\",\n \"folder-multiple\",\n \"folder-multiple-image\",\n \"folder-multiple-outline\",\n \"folder-multiple-plus\",\n \"folder-multiple-plus-outline\",\n \"folder-music\",\n \"folder-music-outline\",\n \"folder-network\",\n \"folder-network-outline\",\n \"folder-off\",\n \"folder-off-outline\",\n \"folder-open\",\n \"folder-open-outline\",\n \"folder-outline\",\n \"folder-play\",\n \"folder-play-outline\",\n \"folder-plus\",\n \"folder-plus-outline\",\n \"folder-pound\",\n \"folder-pound-outline\",\n \"folder-question\",\n \"folder-question-outline\",\n \"folder-refresh\",\n \"folder-refresh-outline\",\n \"folder-remove\",\n \"folder-remove-outline\",\n \"folder-search\",\n \"folder-search-outline\",\n \"folder-settings\",\n \"folder-settings-outline\",\n \"folder-star\",\n \"folder-star-multiple\",\n \"folder-star-multiple-outline\",\n \"folder-star-outline\",\n \"folder-swap\",\n \"folder-swap-outline\",\n \"folder-sync\",\n \"folder-sync-outline\",\n \"folder-table\",\n \"folder-table-outline\",\n \"folder-text\",\n \"folder-text-outline\",\n \"folder-upload\",\n \"folder-upload-outline\",\n \"folder-wrench\",\n \"folder-wrench-outline\",\n \"folder-zip\",\n \"folder-zip-outline\",\n \"font-awesome\",\n \"food\",\n \"food-apple\",\n \"food-apple-outline\",\n \"food-croissant\",\n \"food-drumstick\",\n \"food-drumstick-off\",\n \"food-drumstick-off-outline\",\n \"food-drumstick-outline\",\n \"food-fork-drink\",\n \"food-halal\",\n \"food-hot-dog\",\n \"food-kosher\",\n \"food-off\",\n \"food-off-outline\",\n \"food-outline\",\n \"food-steak\",\n \"food-steak-off\",\n \"food-takeout-box\",\n \"food-takeout-box-outline\",\n \"food-turkey\",\n \"food-variant\",\n \"food-variant-off\",\n \"foot-print\",\n \"football\",\n \"football-australian\",\n \"football-helmet\",\n \"forest\",\n \"forest-outline\",\n \"forklift\",\n \"form-dropdown\",\n \"form-select\",\n \"form-textarea\",\n \"form-textbox\",\n \"form-textbox-lock\",\n \"form-textbox-password\",\n \"format-align-bottom\",\n \"format-align-center\",\n \"format-align-justify\",\n \"format-align-left\",\n \"format-align-middle\",\n \"format-align-right\",\n \"format-align-top\",\n \"format-annotation-minus\",\n \"format-annotation-plus\",\n \"format-bold\",\n \"format-clear\",\n \"format-color-fill\",\n \"format-color-highlight\",\n \"format-color-marker-cancel\",\n \"format-color-text\",\n \"format-columns\",\n \"format-float-center\",\n \"format-float-left\",\n \"format-float-none\",\n \"format-float-right\",\n \"format-font\",\n \"format-font-size-decrease\",\n \"format-font-size-increase\",\n \"format-header-1\",\n \"format-header-2\",\n \"format-header-3\",\n \"format-header-4\",\n \"format-header-5\",\n \"format-header-6\",\n \"format-header-decrease\",\n \"format-header-equal\",\n \"format-header-increase\",\n \"format-header-pound\",\n \"format-horizontal-align-center\",\n \"format-horizontal-align-left\",\n \"format-horizontal-align-right\",\n \"format-indent-decrease\",\n \"format-indent-increase\",\n \"format-italic\",\n \"format-letter-case\",\n \"format-letter-case-lower\",\n \"format-letter-case-upper\",\n \"format-letter-ends-with\",\n \"format-letter-matches\",\n \"format-letter-spacing\",\n \"format-letter-spacing-variant\",\n \"format-letter-starts-with\",\n \"format-line-height\",\n \"format-line-spacing\",\n \"format-line-style\",\n \"format-line-weight\",\n \"format-list-bulleted\",\n \"format-list-bulleted-square\",\n \"format-list-bulleted-triangle\",\n \"format-list-bulleted-type\",\n \"format-list-checkbox\",\n \"format-list-checks\",\n \"format-list-group\",\n \"format-list-group-plus\",\n \"format-list-numbered\",\n \"format-list-numbered-rtl\",\n \"format-list-text\",\n \"format-overline\",\n \"format-page-break\",\n \"format-page-split\",\n \"format-paint\",\n \"format-paragraph\",\n \"format-paragraph-spacing\",\n \"format-pilcrow\",\n \"format-pilcrow-arrow-left\",\n \"format-pilcrow-arrow-right\",\n \"format-quote-close\",\n \"format-quote-close-outline\",\n \"format-quote-open\",\n \"format-quote-open-outline\",\n \"format-rotate-90\",\n \"format-section\",\n \"format-size\",\n \"format-strikethrough\",\n \"format-strikethrough-variant\",\n \"format-subscript\",\n \"format-superscript\",\n \"format-text\",\n \"format-text-rotation-angle-down\",\n \"format-text-rotation-angle-up\",\n \"format-text-rotation-down\",\n \"format-text-rotation-down-vertical\",\n \"format-text-rotation-none\",\n \"format-text-rotation-up\",\n \"format-text-rotation-vertical\",\n \"format-text-variant\",\n \"format-text-variant-outline\",\n \"format-text-wrapping-clip\",\n \"format-text-wrapping-overflow\",\n \"format-text-wrapping-wrap\",\n \"format-textbox\",\n \"format-title\",\n \"format-underline\",\n \"format-underline-wavy\",\n \"format-vertical-align-bottom\",\n \"format-vertical-align-center\",\n \"format-vertical-align-top\",\n \"format-wrap-inline\",\n \"format-wrap-square\",\n \"format-wrap-tight\",\n \"format-wrap-top-bottom\",\n \"forum\",\n \"forum-minus\",\n \"forum-minus-outline\",\n \"forum-outline\",\n \"forum-plus\",\n \"forum-plus-outline\",\n \"forum-remove\",\n \"forum-remove-outline\",\n \"forward\",\n \"forwardburger\",\n \"fountain\",\n \"fountain-pen\",\n \"fountain-pen-tip\",\n \"fraction-one-half\",\n \"freebsd\",\n \"french-fries\",\n \"frequently-asked-questions\",\n \"fridge\",\n \"fridge-alert\",\n \"fridge-alert-outline\",\n \"fridge-bottom\",\n \"fridge-industrial\",\n \"fridge-industrial-alert\",\n \"fridge-industrial-alert-outline\",\n \"fridge-industrial-off\",\n \"fridge-industrial-off-outline\",\n \"fridge-industrial-outline\",\n \"fridge-off\",\n \"fridge-off-outline\",\n \"fridge-outline\",\n \"fridge-top\",\n \"fridge-variant\",\n \"fridge-variant-alert\",\n \"fridge-variant-alert-outline\",\n \"fridge-variant-off\",\n \"fridge-variant-off-outline\",\n \"fridge-variant-outline\",\n \"fruit-cherries\",\n \"fruit-cherries-off\",\n \"fruit-citrus\",\n \"fruit-citrus-off\",\n \"fruit-grapes\",\n \"fruit-grapes-outline\",\n \"fruit-pear\",\n \"fruit-pineapple\",\n \"fruit-watermelon\",\n \"fuel\",\n \"fuel-cell\",\n \"fullscreen\",\n \"fullscreen-exit\",\n \"function\",\n \"function-variant\",\n \"furigana-horizontal\",\n \"furigana-vertical\",\n \"fuse\",\n \"fuse-alert\",\n \"fuse-blade\",\n \"fuse-off\",\n \"gamepad\",\n \"gamepad-circle\",\n \"gamepad-circle-down\",\n \"gamepad-circle-left\",\n \"gamepad-circle-outline\",\n \"gamepad-circle-right\",\n \"gamepad-circle-up\",\n \"gamepad-down\",\n \"gamepad-left\",\n \"gamepad-outline\",\n \"gamepad-right\",\n \"gamepad-round\",\n \"gamepad-round-down\",\n \"gamepad-round-left\",\n \"gamepad-round-outline\",\n \"gamepad-round-right\",\n \"gamepad-round-up\",\n \"gamepad-square\",\n \"gamepad-square-outline\",\n \"gamepad-up\",\n \"gamepad-variant\",\n \"gamepad-variant-outline\",\n \"gamma\",\n \"gantry-crane\",\n \"garage\",\n \"garage-alert\",\n \"garage-alert-variant\",\n \"garage-lock\",\n \"garage-open\",\n \"garage-open-variant\",\n \"garage-variant\",\n \"garage-variant-lock\",\n \"gas-burner\",\n \"gas-cylinder\",\n \"gas-station\",\n \"gas-station-in-use\",\n \"gas-station-in-use-outline\",\n \"gas-station-off\",\n \"gas-station-off-outline\",\n \"gas-station-outline\",\n \"gate\",\n \"gate-alert\",\n \"gate-and\",\n \"gate-arrow-left\",\n \"gate-arrow-right\",\n \"gate-buffer\",\n \"gate-nand\",\n \"gate-nor\",\n \"gate-not\",\n \"gate-open\",\n \"gate-or\",\n \"gate-xnor\",\n \"gate-xor\",\n \"gatsby\",\n \"gauge\",\n \"gauge-empty\",\n \"gauge-full\",\n \"gauge-low\",\n \"gavel\",\n \"gender-female\",\n \"gender-male\",\n \"gender-male-female\",\n \"gender-male-female-variant\",\n \"gender-non-binary\",\n \"gender-transgender\",\n \"generator-mobile\",\n \"generator-portable\",\n \"generator-stationary\",\n \"gentoo\",\n \"gesture\",\n \"gesture-double-tap\",\n \"gesture-pinch\",\n \"gesture-spread\",\n \"gesture-swipe\",\n \"gesture-swipe-down\",\n \"gesture-swipe-horizontal\",\n \"gesture-swipe-left\",\n \"gesture-swipe-right\",\n \"gesture-swipe-up\",\n \"gesture-swipe-vertical\",\n \"gesture-tap\",\n \"gesture-tap-box\",\n \"gesture-tap-button\",\n \"gesture-tap-hold\",\n \"gesture-two-double-tap\",\n \"gesture-two-tap\",\n \"ghost\",\n \"ghost-off\",\n \"ghost-off-outline\",\n \"ghost-outline\",\n \"gift\",\n \"gift-off\",\n \"gift-off-outline\",\n \"gift-open\",\n \"gift-open-outline\",\n \"gift-outline\",\n \"git\",\n \"github\",\n \"gitlab\",\n \"glass-cocktail\",\n \"glass-cocktail-off\",\n \"glass-flute\",\n \"glass-fragile\",\n \"glass-mug\",\n \"glass-mug-off\",\n \"glass-mug-variant\",\n \"glass-mug-variant-off\",\n \"glass-pint-outline\",\n \"glass-stange\",\n \"glass-tulip\",\n \"glass-wine\",\n \"glasses\",\n \"globe-light\",\n \"globe-light-outline\",\n \"globe-model\",\n \"gmail\",\n \"gnome\",\n \"go-kart\",\n \"go-kart-track\",\n \"gog\",\n \"gold\",\n \"golf\",\n \"golf-cart\",\n \"golf-tee\",\n \"gondola\",\n \"goodreads\",\n \"google\",\n \"google-ads\",\n \"google-analytics\",\n \"google-assistant\",\n \"google-cardboard\",\n \"google-chrome\",\n \"google-circles\",\n \"google-circles-communities\",\n \"google-circles-extended\",\n \"google-circles-group\",\n \"google-classroom\",\n \"google-cloud\",\n \"google-downasaur\",\n \"google-drive\",\n \"google-earth\",\n \"google-fit\",\n \"google-glass\",\n \"google-hangouts\",\n \"google-keep\",\n \"google-lens\",\n \"google-maps\",\n \"google-my-business\",\n \"google-nearby\",\n \"google-play\",\n \"google-plus\",\n \"google-podcast\",\n \"google-spreadsheet\",\n \"google-street-view\",\n \"google-translate\",\n \"gradient-horizontal\",\n \"gradient-vertical\",\n \"grain\",\n \"graph\",\n \"graph-outline\",\n \"graphql\",\n \"grass\",\n \"grave-stone\",\n \"grease-pencil\",\n \"greater-than\",\n \"greater-than-or-equal\",\n \"greenhouse\",\n \"grid\",\n \"grid-large\",\n \"grid-off\",\n \"grill\",\n \"grill-outline\",\n \"group\",\n \"guitar-acoustic\",\n \"guitar-electric\",\n \"guitar-pick\",\n \"guitar-pick-outline\",\n \"guy-fawkes-mask\",\n \"gymnastics\",\n \"hail\",\n \"hair-dryer\",\n \"hair-dryer-outline\",\n \"halloween\",\n \"hamburger\",\n \"hamburger-check\",\n \"hamburger-minus\",\n \"hamburger-off\",\n \"hamburger-plus\",\n \"hamburger-remove\",\n \"hammer\",\n \"hammer-screwdriver\",\n \"hammer-sickle\",\n \"hammer-wrench\",\n \"hand-back-left\",\n \"hand-back-left-off\",\n \"hand-back-left-off-outline\",\n \"hand-back-left-outline\",\n \"hand-back-right\",\n \"hand-back-right-off\",\n \"hand-back-right-off-outline\",\n \"hand-back-right-outline\",\n \"hand-clap\",\n \"hand-clap-off\",\n \"hand-coin\",\n \"hand-coin-outline\",\n \"hand-cycle\",\n \"hand-extended\",\n \"hand-extended-outline\",\n \"hand-front-left\",\n \"hand-front-left-outline\",\n \"hand-front-right\",\n \"hand-front-right-outline\",\n \"hand-heart\",\n \"hand-heart-outline\",\n \"hand-okay\",\n \"hand-peace\",\n \"hand-peace-variant\",\n \"hand-pointing-down\",\n \"hand-pointing-left\",\n \"hand-pointing-right\",\n \"hand-pointing-up\",\n \"hand-saw\",\n \"hand-wash\",\n \"hand-wash-outline\",\n \"hand-water\",\n \"hand-wave\",\n \"hand-wave-outline\",\n \"handball\",\n \"handcuffs\",\n \"hands-pray\",\n \"handshake\",\n \"handshake-outline\",\n \"hanger\",\n \"hard-hat\",\n \"harddisk\",\n \"harddisk-plus\",\n \"harddisk-remove\",\n \"hat-fedora\",\n \"hazard-lights\",\n \"hdmi-port\",\n \"hdr\",\n \"hdr-off\",\n \"head\",\n \"head-alert\",\n \"head-alert-outline\",\n \"head-check\",\n \"head-check-outline\",\n \"head-cog\",\n \"head-cog-outline\",\n \"head-dots-horizontal\",\n \"head-dots-horizontal-outline\",\n \"head-flash\",\n \"head-flash-outline\",\n \"head-heart\",\n \"head-heart-outline\",\n \"head-lightbulb\",\n \"head-lightbulb-outline\",\n \"head-minus\",\n \"head-minus-outline\",\n \"head-outline\",\n \"head-plus\",\n \"head-plus-outline\",\n \"head-question\",\n \"head-question-outline\",\n \"head-remove\",\n \"head-remove-outline\",\n \"head-snowflake\",\n \"head-snowflake-outline\",\n \"head-sync\",\n \"head-sync-outline\",\n \"headphones\",\n \"headphones-bluetooth\",\n \"headphones-box\",\n \"headphones-off\",\n \"headphones-settings\",\n \"headset\",\n \"headset-dock\",\n \"headset-off\",\n \"heart\",\n \"heart-box\",\n \"heart-box-outline\",\n \"heart-broken\",\n \"heart-broken-outline\",\n \"heart-circle\",\n \"heart-circle-outline\",\n \"heart-cog\",\n \"heart-cog-outline\",\n \"heart-flash\",\n \"heart-half\",\n \"heart-half-full\",\n \"heart-half-outline\",\n \"heart-minus\",\n \"heart-minus-outline\",\n \"heart-multiple\",\n \"heart-multiple-outline\",\n \"heart-off\",\n \"heart-off-outline\",\n \"heart-outline\",\n \"heart-plus\",\n \"heart-plus-outline\",\n \"heart-pulse\",\n \"heart-remove\",\n \"heart-remove-outline\",\n \"heart-search\",\n \"heart-settings\",\n \"heart-settings-outline\",\n \"heat-pump\",\n \"heat-pump-outline\",\n \"heat-wave\",\n \"heating-coil\",\n \"helicopter\",\n \"help\",\n \"help-box\",\n \"help-box-multiple\",\n \"help-box-multiple-outline\",\n \"help-box-outline\",\n \"help-circle\",\n \"help-circle-outline\",\n \"help-network\",\n \"help-network-outline\",\n \"help-rhombus\",\n \"help-rhombus-outline\",\n \"hexadecimal\",\n \"hexagon\",\n \"hexagon-multiple\",\n \"hexagon-multiple-outline\",\n \"hexagon-outline\",\n \"hexagon-slice-1\",\n \"hexagon-slice-2\",\n \"hexagon-slice-3\",\n \"hexagon-slice-4\",\n \"hexagon-slice-5\",\n \"hexagon-slice-6\",\n \"hexagram\",\n \"hexagram-outline\",\n \"high-definition\",\n \"high-definition-box\",\n \"highway\",\n \"hiking\",\n \"history\",\n \"hockey-puck\",\n \"hockey-sticks\",\n \"hololens\",\n \"home\",\n \"home-account\",\n \"home-alert\",\n \"home-alert-outline\",\n \"home-analytics\",\n \"home-assistant\",\n \"home-automation\",\n \"home-battery\",\n \"home-battery-outline\",\n \"home-circle\",\n \"home-circle-outline\",\n \"home-city\",\n \"home-city-outline\",\n \"home-clock\",\n \"home-clock-outline\",\n \"home-edit\",\n \"home-edit-outline\",\n \"home-export-outline\",\n \"home-flood\",\n \"home-floor-0\",\n \"home-floor-1\",\n \"home-floor-2\",\n \"home-floor-3\",\n \"home-floor-a\",\n \"home-floor-b\",\n \"home-floor-g\",\n \"home-floor-l\",\n \"home-floor-negative-1\",\n \"home-group\",\n \"home-group-minus\",\n \"home-group-plus\",\n \"home-group-remove\",\n \"home-heart\",\n \"home-import-outline\",\n \"home-lightbulb\",\n \"home-lightbulb-outline\",\n \"home-lightning-bolt\",\n \"home-lightning-bolt-outline\",\n \"home-lock\",\n \"home-lock-open\",\n \"home-map-marker\",\n \"home-minus\",\n \"home-minus-outline\",\n \"home-modern\",\n \"home-off\",\n \"home-off-outline\",\n \"home-outline\",\n \"home-percent\",\n \"home-percent-outline\",\n \"home-plus\",\n \"home-plus-outline\",\n \"home-remove\",\n \"home-remove-outline\",\n \"home-roof\",\n \"home-search\",\n \"home-search-outline\",\n \"home-silo\",\n \"home-silo-outline\",\n \"home-sound-in\",\n \"home-sound-in-outline\",\n \"home-sound-out\",\n \"home-sound-out-outline\",\n \"home-switch\",\n \"home-switch-outline\",\n \"home-thermometer\",\n \"home-thermometer-outline\",\n \"home-variant\",\n \"home-variant-outline\",\n \"hook\",\n \"hook-off\",\n \"hoop-house\",\n \"hops\",\n \"horizontal-rotate-clockwise\",\n \"horizontal-rotate-counterclockwise\",\n \"horse\",\n \"horse-human\",\n \"horse-variant\",\n \"horse-variant-fast\",\n \"horseshoe\",\n \"hospital\",\n \"hospital-box\",\n \"hospital-box-outline\",\n \"hospital-building\",\n \"hospital-marker\",\n \"hot-tub\",\n \"hours-12\",\n \"hours-24\",\n \"hub\",\n \"hub-outline\",\n \"hubspot\",\n \"hulu\",\n \"human\",\n \"human-baby-changing-table\",\n \"human-cane\",\n \"human-capacity-decrease\",\n \"human-capacity-increase\",\n \"human-child\",\n \"human-dolly\",\n \"human-edit\",\n \"human-female\",\n \"human-female-boy\",\n \"human-female-dance\",\n \"human-female-female\",\n \"human-female-female-child\",\n \"human-female-girl\",\n \"human-greeting\",\n \"human-greeting-proximity\",\n \"human-greeting-variant\",\n \"human-handsdown\",\n \"human-handsup\",\n \"human-male\",\n \"human-male-board\",\n \"human-male-board-poll\",\n \"human-male-boy\",\n \"human-male-child\",\n \"human-male-female\",\n \"human-male-female-child\",\n \"human-male-girl\",\n \"human-male-height\",\n \"human-male-height-variant\",\n \"human-male-male\",\n \"human-male-male-child\",\n \"human-non-binary\",\n \"human-pregnant\",\n \"human-queue\",\n \"human-scooter\",\n \"human-walker\",\n \"human-wheelchair\",\n \"human-white-cane\",\n \"humble-bundle\",\n \"hvac\",\n \"hvac-off\",\n \"hydraulic-oil-level\",\n \"hydraulic-oil-temperature\",\n \"hydro-power\",\n \"hydrogen-station\",\n \"ice-cream\",\n \"ice-cream-off\",\n \"ice-pop\",\n \"id-card\",\n \"identifier\",\n \"ideogram-cjk\",\n \"ideogram-cjk-variant\",\n \"image\",\n \"image-album\",\n \"image-area\",\n \"image-area-close\",\n \"image-auto-adjust\",\n \"image-broken\",\n \"image-broken-variant\",\n \"image-check\",\n \"image-check-outline\",\n \"image-edit\",\n \"image-edit-outline\",\n \"image-filter-black-white\",\n \"image-filter-center-focus\",\n \"image-filter-center-focus-strong\",\n \"image-filter-center-focus-strong-outline\",\n \"image-filter-center-focus-weak\",\n \"image-filter-drama\",\n \"image-filter-drama-outline\",\n \"image-filter-frames\",\n \"image-filter-hdr\",\n \"image-filter-hdr-outline\",\n \"image-filter-none\",\n \"image-filter-tilt-shift\",\n \"image-filter-vintage\",\n \"image-frame\",\n \"image-lock\",\n \"image-lock-outline\",\n \"image-marker\",\n \"image-marker-outline\",\n \"image-minus\",\n \"image-minus-outline\",\n \"image-move\",\n \"image-multiple\",\n \"image-multiple-outline\",\n \"image-off\",\n \"image-off-outline\",\n \"image-outline\",\n \"image-plus\",\n \"image-plus-outline\",\n \"image-refresh\",\n \"image-refresh-outline\",\n \"image-remove\",\n \"image-remove-outline\",\n \"image-search\",\n \"image-search-outline\",\n \"image-size-select-actual\",\n \"image-size-select-large\",\n \"image-size-select-small\",\n \"image-sync\",\n \"image-sync-outline\",\n \"image-text\",\n \"import\",\n \"inbox\",\n \"inbox-arrow-down\",\n \"inbox-arrow-down-outline\",\n \"inbox-arrow-up\",\n \"inbox-arrow-up-outline\",\n \"inbox-full\",\n \"inbox-full-outline\",\n \"inbox-multiple\",\n \"inbox-multiple-outline\",\n \"inbox-outline\",\n \"inbox-remove\",\n \"inbox-remove-outline\",\n \"incognito\",\n \"incognito-circle\",\n \"incognito-circle-off\",\n \"incognito-off\",\n \"induction\",\n \"infinity\",\n \"information\",\n \"information-box\",\n \"information-box-outline\",\n \"information-off\",\n \"information-off-outline\",\n \"information-outline\",\n \"information-slab-box\",\n \"information-slab-box-outline\",\n \"information-slab-circle\",\n \"information-slab-circle-outline\",\n \"information-slab-symbol\",\n \"information-symbol\",\n \"information-variant\",\n \"information-variant-box\",\n \"information-variant-box-outline\",\n \"information-variant-circle\",\n \"information-variant-circle-outline\",\n \"instagram\",\n \"instrument-triangle\",\n \"integrated-circuit-chip\",\n \"invert-colors\",\n \"invert-colors-off\",\n \"invoice\",\n \"invoice-arrow-left\",\n \"invoice-arrow-left-outline\",\n \"invoice-arrow-right\",\n \"invoice-arrow-right-outline\",\n \"invoice-check\",\n \"invoice-check-outline\",\n \"invoice-clock\",\n \"invoice-clock-outline\",\n \"invoice-edit\",\n \"invoice-edit-outline\",\n \"invoice-export-outline\",\n \"invoice-fast\",\n \"invoice-fast-outline\",\n \"invoice-import\",\n \"invoice-import-outline\",\n \"invoice-list\",\n \"invoice-list-outline\",\n \"invoice-minus\",\n \"invoice-minus-outline\",\n \"invoice-multiple\",\n \"invoice-multiple-outline\",\n \"invoice-outline\",\n \"invoice-plus\",\n \"invoice-plus-outline\",\n \"invoice-remove\",\n \"invoice-remove-outline\",\n \"invoice-send\",\n \"invoice-send-outline\",\n \"invoice-text\",\n \"invoice-text-arrow-left\",\n \"invoice-text-arrow-left-outline\",\n \"invoice-text-arrow-right\",\n \"invoice-text-arrow-right-outline\",\n \"invoice-text-check\",\n \"invoice-text-check-outline\",\n \"invoice-text-clock\",\n \"invoice-text-clock-outline\",\n \"invoice-text-edit\",\n \"invoice-text-edit-outline\",\n \"invoice-text-fast\",\n \"invoice-text-fast-outline\",\n \"invoice-text-minus\",\n \"invoice-text-minus-outline\",\n \"invoice-text-multiple\",\n \"invoice-text-multiple-outline\",\n \"invoice-text-outline\",\n \"invoice-text-plus\",\n \"invoice-text-plus-outline\",\n \"invoice-text-remove\",\n \"invoice-text-remove-outline\",\n \"invoice-text-send\",\n \"invoice-text-send-outline\",\n \"iobroker\",\n \"ip\",\n \"ip-network\",\n \"ip-network-outline\",\n \"ip-outline\",\n \"ipod\",\n \"iron\",\n \"iron-board\",\n \"iron-outline\",\n \"island\",\n \"island-variant\",\n \"iv-bag\",\n \"jabber\",\n \"jeepney\",\n \"jellyfish\",\n \"jellyfish-outline\",\n \"jira\",\n \"jquery\",\n \"jsfiddle\",\n \"jump-rope\",\n \"kabaddi\",\n \"kangaroo\",\n \"karate\",\n \"kayaking\",\n \"keg\",\n \"kettle\",\n \"kettle-alert\",\n \"kettle-alert-outline\",\n \"kettle-off\",\n \"kettle-off-outline\",\n \"kettle-outline\",\n \"kettle-pour-over\",\n \"kettle-steam\",\n \"kettle-steam-outline\",\n \"kettlebell\",\n \"key\",\n \"key-alert\",\n \"key-alert-outline\",\n \"key-arrow-right\",\n \"key-chain\",\n \"key-chain-variant\",\n \"key-change\",\n \"key-link\",\n \"key-minus\",\n \"key-outline\",\n \"key-plus\",\n \"key-remove\",\n \"key-star\",\n \"key-variant\",\n \"key-wireless\",\n \"keyboard\",\n \"keyboard-backspace\",\n \"keyboard-caps\",\n \"keyboard-close\",\n \"keyboard-close-outline\",\n \"keyboard-esc\",\n \"keyboard-f1\",\n \"keyboard-f10\",\n \"keyboard-f11\",\n \"keyboard-f12\",\n \"keyboard-f2\",\n \"keyboard-f3\",\n \"keyboard-f4\",\n \"keyboard-f5\",\n \"keyboard-f6\",\n \"keyboard-f7\",\n \"keyboard-f8\",\n \"keyboard-f9\",\n \"keyboard-off\",\n \"keyboard-off-outline\",\n \"keyboard-outline\",\n \"keyboard-return\",\n \"keyboard-settings\",\n \"keyboard-settings-outline\",\n \"keyboard-space\",\n \"keyboard-tab\",\n \"keyboard-tab-reverse\",\n \"keyboard-variant\",\n \"khanda\",\n \"kickstarter\",\n \"kite\",\n \"kite-outline\",\n \"kitesurfing\",\n \"klingon\",\n \"knife\",\n \"knife-military\",\n \"knob\",\n \"koala\",\n \"kodi\",\n \"kubernetes\",\n \"label\",\n \"label-multiple\",\n \"label-multiple-outline\",\n \"label-off\",\n \"label-off-outline\",\n \"label-outline\",\n \"label-percent\",\n \"label-percent-outline\",\n \"label-variant\",\n \"label-variant-outline\",\n \"ladder\",\n \"ladybug\",\n \"lambda\",\n \"lamp\",\n \"lamp-outline\",\n \"lamps\",\n \"lamps-outline\",\n \"lan\",\n \"lan-check\",\n \"lan-connect\",\n \"lan-disconnect\",\n \"lan-pending\",\n \"land-fields\",\n \"land-plots\",\n \"land-plots-circle\",\n \"land-plots-circle-variant\",\n \"land-plots-marker\",\n \"land-rows-horizontal\",\n \"land-rows-vertical\",\n \"landslide\",\n \"landslide-outline\",\n \"language-c\",\n \"language-cpp\",\n \"language-csharp\",\n \"language-css3\",\n \"language-fortran\",\n \"language-go\",\n \"language-haskell\",\n \"language-html5\",\n \"language-java\",\n \"language-javascript\",\n \"language-kotlin\",\n \"language-lua\",\n \"language-markdown\",\n \"language-markdown-outline\",\n \"language-php\",\n \"language-python\",\n \"language-r\",\n \"language-ruby\",\n \"language-ruby-on-rails\",\n \"language-rust\",\n \"language-swift\",\n \"language-typescript\",\n \"language-xaml\",\n \"laptop\",\n \"laptop-account\",\n \"laptop-off\",\n \"laravel\",\n \"laser-pointer\",\n \"lasso\",\n \"lastpass\",\n \"latitude\",\n \"launch\",\n \"lava-lamp\",\n \"layers\",\n \"layers-edit\",\n \"layers-minus\",\n \"layers-off\",\n \"layers-off-outline\",\n \"layers-outline\",\n \"layers-plus\",\n \"layers-remove\",\n \"layers-search\",\n \"layers-search-outline\",\n \"layers-triple\",\n \"layers-triple-outline\",\n \"lead-pencil\",\n \"leaf\",\n \"leaf-circle\",\n \"leaf-circle-outline\",\n \"leaf-maple\",\n \"leaf-maple-off\",\n \"leaf-off\",\n \"leak\",\n \"leak-off\",\n \"lectern\",\n \"led-off\",\n \"led-on\",\n \"led-outline\",\n \"led-strip\",\n \"led-strip-variant\",\n \"led-strip-variant-off\",\n \"led-variant-off\",\n \"led-variant-on\",\n \"led-variant-outline\",\n \"leek\",\n \"less-than\",\n \"less-than-or-equal\",\n \"library\",\n \"library-outline\",\n \"library-shelves\",\n \"license\",\n \"lifebuoy\",\n \"light-flood-down\",\n \"light-flood-up\",\n \"light-recessed\",\n \"light-switch\",\n \"light-switch-off\",\n \"lightbulb\",\n \"lightbulb-alert\",\n \"lightbulb-alert-outline\",\n \"lightbulb-auto\",\n \"lightbulb-auto-outline\",\n \"lightbulb-cfl\",\n \"lightbulb-cfl-off\",\n \"lightbulb-cfl-spiral\",\n \"lightbulb-cfl-spiral-off\",\n \"lightbulb-fluorescent-tube\",\n \"lightbulb-fluorescent-tube-outline\",\n \"lightbulb-group\",\n \"lightbulb-group-off\",\n \"lightbulb-group-off-outline\",\n \"lightbulb-group-outline\",\n \"lightbulb-multiple\",\n \"lightbulb-multiple-off\",\n \"lightbulb-multiple-off-outline\",\n \"lightbulb-multiple-outline\",\n \"lightbulb-night\",\n \"lightbulb-night-outline\",\n \"lightbulb-off\",\n \"lightbulb-off-outline\",\n \"lightbulb-on\",\n \"lightbulb-on-10\",\n \"lightbulb-on-20\",\n \"lightbulb-on-30\",\n \"lightbulb-on-40\",\n \"lightbulb-on-50\",\n \"lightbulb-on-60\",\n \"lightbulb-on-70\",\n \"lightbulb-on-80\",\n \"lightbulb-on-90\",\n \"lightbulb-on-outline\",\n \"lightbulb-outline\",\n \"lightbulb-question\",\n \"lightbulb-question-outline\",\n \"lightbulb-spot\",\n \"lightbulb-spot-off\",\n \"lightbulb-variant\",\n \"lightbulb-variant-outline\",\n \"lighthouse\",\n \"lighthouse-on\",\n \"lightning-bolt\",\n \"lightning-bolt-circle\",\n \"lightning-bolt-outline\",\n \"line-scan\",\n \"lingerie\",\n \"link\",\n \"link-box\",\n \"link-box-outline\",\n \"link-box-variant\",\n \"link-box-variant-outline\",\n \"link-circle\",\n \"link-circle-outline\",\n \"link-edit\",\n \"link-lock\",\n \"link-off\",\n \"link-plus\",\n \"link-variant\",\n \"link-variant-minus\",\n \"link-variant-off\",\n \"link-variant-plus\",\n \"link-variant-remove\",\n \"linkedin\",\n \"linux\",\n \"linux-mint\",\n \"lipstick\",\n \"liquid-spot\",\n \"liquor\",\n \"list-box\",\n \"list-box-outline\",\n \"list-status\",\n \"litecoin\",\n \"loading\",\n \"location-enter\",\n \"location-exit\",\n \"lock\",\n \"lock-alert\",\n \"lock-alert-outline\",\n \"lock-check\",\n \"lock-check-outline\",\n \"lock-clock\",\n \"lock-minus\",\n \"lock-minus-outline\",\n \"lock-off\",\n \"lock-off-outline\",\n \"lock-open\",\n \"lock-open-alert\",\n \"lock-open-alert-outline\",\n \"lock-open-check\",\n \"lock-open-check-outline\",\n \"lock-open-minus\",\n \"lock-open-minus-outline\",\n \"lock-open-outline\",\n \"lock-open-plus\",\n \"lock-open-plus-outline\",\n \"lock-open-remove\",\n \"lock-open-remove-outline\",\n \"lock-open-variant\",\n \"lock-open-variant-outline\",\n \"lock-outline\",\n \"lock-pattern\",\n \"lock-percent\",\n \"lock-percent-open\",\n \"lock-percent-open-outline\",\n \"lock-percent-open-variant\",\n \"lock-percent-open-variant-outline\",\n \"lock-percent-outline\",\n \"lock-plus\",\n \"lock-plus-outline\",\n \"lock-question\",\n \"lock-remove\",\n \"lock-remove-outline\",\n \"lock-reset\",\n \"lock-smart\",\n \"locker\",\n \"locker-multiple\",\n \"login\",\n \"login-variant\",\n \"logout\",\n \"logout-variant\",\n \"longitude\",\n \"looks\",\n \"lotion\",\n \"lotion-outline\",\n \"lotion-plus\",\n \"lotion-plus-outline\",\n \"loupe\",\n \"lumx\",\n \"lungs\",\n \"mace\",\n \"magazine-pistol\",\n \"magazine-rifle\",\n \"magic-staff\",\n \"magnet\",\n \"magnet-on\",\n \"magnify\",\n \"magnify-close\",\n \"magnify-expand\",\n \"magnify-minus\",\n \"magnify-minus-cursor\",\n \"magnify-minus-outline\",\n \"magnify-plus\",\n \"magnify-plus-cursor\",\n \"magnify-plus-outline\",\n \"magnify-remove-cursor\",\n \"magnify-remove-outline\",\n \"magnify-scan\",\n \"mail\",\n \"mailbox\",\n \"mailbox-open\",\n \"mailbox-open-outline\",\n \"mailbox-open-up\",\n \"mailbox-open-up-outline\",\n \"mailbox-outline\",\n \"mailbox-up\",\n \"mailbox-up-outline\",\n \"manjaro\",\n \"map\",\n \"map-check\",\n \"map-check-outline\",\n \"map-clock\",\n \"map-clock-outline\",\n \"map-legend\",\n \"map-marker\",\n \"map-marker-account\",\n \"map-marker-account-outline\",\n \"map-marker-alert\",\n \"map-marker-alert-outline\",\n \"map-marker-check\",\n \"map-marker-check-outline\",\n \"map-marker-circle\",\n \"map-marker-distance\",\n \"map-marker-down\",\n \"map-marker-left\",\n \"map-marker-left-outline\",\n \"map-marker-minus\",\n \"map-marker-minus-outline\",\n \"map-marker-multiple\",\n \"map-marker-multiple-outline\",\n \"map-marker-off\",\n \"map-marker-off-outline\",\n \"map-marker-outline\",\n \"map-marker-path\",\n \"map-marker-plus\",\n \"map-marker-plus-outline\",\n \"map-marker-question\",\n \"map-marker-question-outline\",\n \"map-marker-radius\",\n \"map-marker-radius-outline\",\n \"map-marker-remove\",\n \"map-marker-remove-outline\",\n \"map-marker-remove-variant\",\n \"map-marker-right\",\n \"map-marker-right-outline\",\n \"map-marker-star\",\n \"map-marker-star-outline\",\n \"map-marker-up\",\n \"map-minus\",\n \"map-outline\",\n \"map-plus\",\n \"map-search\",\n \"map-search-outline\",\n \"mapbox\",\n \"margin\",\n \"marker\",\n \"marker-cancel\",\n \"marker-check\",\n \"mastodon\",\n \"material-design\",\n \"material-ui\",\n \"math-compass\",\n \"math-cos\",\n \"math-integral\",\n \"math-integral-box\",\n \"math-log\",\n \"math-norm\",\n \"math-norm-box\",\n \"math-sin\",\n \"math-tan\",\n \"matrix\",\n \"medal\",\n \"medal-outline\",\n \"medical-bag\",\n \"medical-cotton-swab\",\n \"medication\",\n \"medication-outline\",\n \"meditation\",\n \"memory\",\n \"memory-arrow-down\",\n \"menorah\",\n \"menorah-fire\",\n \"menu\",\n \"menu-close\",\n \"menu-down\",\n \"menu-down-outline\",\n \"menu-left\",\n \"menu-left-outline\",\n \"menu-open\",\n \"menu-right\",\n \"menu-right-outline\",\n \"menu-swap\",\n \"menu-swap-outline\",\n \"menu-up\",\n \"menu-up-outline\",\n \"merge\",\n \"message\",\n \"message-alert\",\n \"message-alert-outline\",\n \"message-arrow-left\",\n \"message-arrow-left-outline\",\n \"message-arrow-right\",\n \"message-arrow-right-outline\",\n \"message-badge\",\n \"message-badge-outline\",\n \"message-bookmark\",\n \"message-bookmark-outline\",\n \"message-bulleted\",\n \"message-bulleted-off\",\n \"message-check\",\n \"message-check-outline\",\n \"message-cog\",\n \"message-cog-outline\",\n \"message-draw\",\n \"message-fast\",\n \"message-fast-outline\",\n \"message-flash\",\n \"message-flash-outline\",\n \"message-image\",\n \"message-image-outline\",\n \"message-lock\",\n \"message-lock-outline\",\n \"message-minus\",\n \"message-minus-outline\",\n \"message-off\",\n \"message-off-outline\",\n \"message-outline\",\n \"message-plus\",\n \"message-plus-outline\",\n \"message-processing\",\n \"message-processing-outline\",\n \"message-question\",\n \"message-question-outline\",\n \"message-reply\",\n \"message-reply-outline\",\n \"message-reply-text\",\n \"message-reply-text-outline\",\n \"message-settings\",\n \"message-settings-outline\",\n \"message-star\",\n \"message-star-outline\",\n \"message-text\",\n \"message-text-clock\",\n \"message-text-clock-outline\",\n \"message-text-fast\",\n \"message-text-fast-outline\",\n \"message-text-lock\",\n \"message-text-lock-outline\",\n \"message-text-outline\",\n \"message-video\",\n \"meteor\",\n \"meter-electric\",\n \"meter-electric-outline\",\n \"meter-gas\",\n \"meter-gas-outline\",\n \"metronome\",\n \"metronome-tick\",\n \"micro-sd\",\n \"microphone\",\n \"microphone-message\",\n \"microphone-message-off\",\n \"microphone-minus\",\n \"microphone-off\",\n \"microphone-outline\",\n \"microphone-plus\",\n \"microphone-question\",\n \"microphone-question-outline\",\n \"microphone-settings\",\n \"microphone-variant\",\n \"microphone-variant-off\",\n \"microscope\",\n \"microsoft\",\n \"microsoft-access\",\n \"microsoft-azure\",\n \"microsoft-azure-devops\",\n \"microsoft-bing\",\n \"microsoft-dynamics-365\",\n \"microsoft-edge\",\n \"microsoft-excel\",\n \"microsoft-internet-explorer\",\n \"microsoft-office\",\n \"microsoft-onedrive\",\n \"microsoft-onenote\",\n \"microsoft-outlook\",\n \"microsoft-powerpoint\",\n \"microsoft-sharepoint\",\n \"microsoft-teams\",\n \"microsoft-visual-studio\",\n \"microsoft-visual-studio-code\",\n \"microsoft-windows\",\n \"microsoft-windows-classic\",\n \"microsoft-word\",\n \"microsoft-xbox\",\n \"microsoft-xbox-controller\",\n \"microsoft-xbox-controller-battery-alert\",\n \"microsoft-xbox-controller-battery-charging\",\n \"microsoft-xbox-controller-battery-empty\",\n \"microsoft-xbox-controller-battery-full\",\n \"microsoft-xbox-controller-battery-low\",\n \"microsoft-xbox-controller-battery-medium\",\n \"microsoft-xbox-controller-battery-unknown\",\n \"microsoft-xbox-controller-menu\",\n \"microsoft-xbox-controller-off\",\n \"microsoft-xbox-controller-view\",\n \"microwave\",\n \"microwave-off\",\n \"middleware\",\n \"middleware-outline\",\n \"midi\",\n \"midi-port\",\n \"mine\",\n \"minecraft\",\n \"mini-sd\",\n \"minidisc\",\n \"minus\",\n \"minus-box\",\n \"minus-box-multiple\",\n \"minus-box-multiple-outline\",\n \"minus-box-outline\",\n \"minus-circle\",\n \"minus-circle-multiple\",\n \"minus-circle-multiple-outline\",\n \"minus-circle-off\",\n \"minus-circle-off-outline\",\n \"minus-circle-outline\",\n \"minus-network\",\n \"minus-network-outline\",\n \"minus-thick\",\n \"mirror\",\n \"mirror-rectangle\",\n \"mirror-variant\",\n \"mixed-martial-arts\",\n \"mixed-reality\",\n \"molecule\",\n \"molecule-co\",\n \"molecule-co2\",\n \"monitor\",\n \"monitor-account\",\n \"monitor-arrow-down\",\n \"monitor-arrow-down-variant\",\n \"monitor-cellphone\",\n \"monitor-cellphone-star\",\n \"monitor-dashboard\",\n \"monitor-edit\",\n \"monitor-eye\",\n \"monitor-lock\",\n \"monitor-multiple\",\n \"monitor-off\",\n \"monitor-screenshot\",\n \"monitor-share\",\n \"monitor-shimmer\",\n \"monitor-small\",\n \"monitor-speaker\",\n \"monitor-speaker-off\",\n \"monitor-star\",\n \"monitor-vertical\",\n \"moon-first-quarter\",\n \"moon-full\",\n \"moon-last-quarter\",\n \"moon-new\",\n \"moon-waning-crescent\",\n \"moon-waning-gibbous\",\n \"moon-waxing-crescent\",\n \"moon-waxing-gibbous\",\n \"moped\",\n \"moped-electric\",\n \"moped-electric-outline\",\n \"moped-outline\",\n \"more\",\n \"mortar-pestle\",\n \"mortar-pestle-plus\",\n \"mosque\",\n \"mosque-outline\",\n \"mother-heart\",\n \"mother-nurse\",\n \"motion\",\n \"motion-outline\",\n \"motion-pause\",\n \"motion-pause-outline\",\n \"motion-play\",\n \"motion-play-outline\",\n \"motion-sensor\",\n \"motion-sensor-off\",\n \"motorbike\",\n \"motorbike-electric\",\n \"motorbike-off\",\n \"mouse\",\n \"mouse-bluetooth\",\n \"mouse-left-click\",\n \"mouse-left-click-outline\",\n \"mouse-move-down\",\n \"mouse-move-up\",\n \"mouse-move-vertical\",\n \"mouse-off\",\n \"mouse-outline\",\n \"mouse-right-click\",\n \"mouse-right-click-outline\",\n \"mouse-scroll-wheel\",\n \"mouse-variant\",\n \"mouse-variant-off\",\n \"move-resize\",\n \"move-resize-variant\",\n \"movie\",\n \"movie-check\",\n \"movie-check-outline\",\n \"movie-cog\",\n \"movie-cog-outline\",\n \"movie-edit\",\n \"movie-edit-outline\",\n \"movie-filter\",\n \"movie-filter-outline\",\n \"movie-minus\",\n \"movie-minus-outline\",\n \"movie-off\",\n \"movie-off-outline\",\n \"movie-open\",\n \"movie-open-check\",\n \"movie-open-check-outline\",\n \"movie-open-cog\",\n \"movie-open-cog-outline\",\n \"movie-open-edit\",\n \"movie-open-edit-outline\",\n \"movie-open-minus\",\n \"movie-open-minus-outline\",\n \"movie-open-off\",\n \"movie-open-off-outline\",\n \"movie-open-outline\",\n \"movie-open-play\",\n \"movie-open-play-outline\",\n \"movie-open-plus\",\n \"movie-open-plus-outline\",\n \"movie-open-remove\",\n \"movie-open-remove-outline\",\n \"movie-open-settings\",\n \"movie-open-settings-outline\",\n \"movie-open-star\",\n \"movie-open-star-outline\",\n \"movie-outline\",\n \"movie-play\",\n \"movie-play-outline\",\n \"movie-plus\",\n \"movie-plus-outline\",\n \"movie-remove\",\n \"movie-remove-outline\",\n \"movie-roll\",\n \"movie-search\",\n \"movie-search-outline\",\n \"movie-settings\",\n \"movie-settings-outline\",\n \"movie-star\",\n \"movie-star-outline\",\n \"mower\",\n \"mower-bag\",\n \"mower-bag-on\",\n \"mower-on\",\n \"muffin\",\n \"multicast\",\n \"multimedia\",\n \"multiplication\",\n \"multiplication-box\",\n \"mushroom\",\n \"mushroom-off\",\n \"mushroom-off-outline\",\n \"mushroom-outline\",\n \"music\",\n \"music-accidental-double-flat\",\n \"music-accidental-double-sharp\",\n \"music-accidental-flat\",\n \"music-accidental-natural\",\n \"music-accidental-sharp\",\n \"music-box\",\n \"music-box-multiple\",\n \"music-box-multiple-outline\",\n \"music-box-outline\",\n \"music-circle\",\n \"music-circle-outline\",\n \"music-clef-alto\",\n \"music-clef-bass\",\n \"music-clef-treble\",\n \"music-note\",\n \"music-note-bluetooth\",\n \"music-note-bluetooth-off\",\n \"music-note-eighth\",\n \"music-note-eighth-dotted\",\n \"music-note-half\",\n \"music-note-half-dotted\",\n \"music-note-minus\",\n \"music-note-off\",\n \"music-note-off-outline\",\n \"music-note-outline\",\n \"music-note-plus\",\n \"music-note-quarter\",\n \"music-note-quarter-dotted\",\n \"music-note-sixteenth\",\n \"music-note-sixteenth-dotted\",\n \"music-note-whole\",\n \"music-note-whole-dotted\",\n \"music-off\",\n \"music-rest-eighth\",\n \"music-rest-half\",\n \"music-rest-quarter\",\n \"music-rest-sixteenth\",\n \"music-rest-whole\",\n \"mustache\",\n \"nail\",\n \"nas\",\n \"nativescript\",\n \"nature\",\n \"nature-outline\",\n \"nature-people\",\n \"nature-people-outline\",\n \"navigation\",\n \"navigation-outline\",\n \"navigation-variant\",\n \"navigation-variant-outline\",\n \"near-me\",\n \"necklace\",\n \"needle\",\n \"needle-off\",\n \"netflix\",\n \"network\",\n \"network-off\",\n \"network-off-outline\",\n \"network-outline\",\n \"network-pos\",\n \"network-strength-1\",\n \"network-strength-1-alert\",\n \"network-strength-2\",\n \"network-strength-2-alert\",\n \"network-strength-3\",\n \"network-strength-3-alert\",\n \"network-strength-4\",\n \"network-strength-4-alert\",\n \"network-strength-4-cog\",\n \"network-strength-off\",\n \"network-strength-off-outline\",\n \"network-strength-outline\",\n \"new-box\",\n \"newspaper\",\n \"newspaper-check\",\n \"newspaper-minus\",\n \"newspaper-plus\",\n \"newspaper-remove\",\n \"newspaper-variant\",\n \"newspaper-variant-multiple\",\n \"newspaper-variant-multiple-outline\",\n \"newspaper-variant-outline\",\n \"nfc\",\n \"nfc-search-variant\",\n \"nfc-tap\",\n \"nfc-variant\",\n \"nfc-variant-off\",\n \"ninja\",\n \"nintendo-game-boy\",\n \"nintendo-switch\",\n \"nintendo-wii\",\n \"nintendo-wiiu\",\n \"nix\",\n \"nodejs\",\n \"noodles\",\n \"not-equal\",\n \"not-equal-variant\",\n \"note\",\n \"note-alert\",\n \"note-alert-outline\",\n \"note-check\",\n \"note-check-outline\",\n \"note-edit\",\n \"note-edit-outline\",\n \"note-minus\",\n \"note-minus-outline\",\n \"note-multiple\",\n \"note-multiple-outline\",\n \"note-off\",\n \"note-off-outline\",\n \"note-outline\",\n \"note-plus\",\n \"note-plus-outline\",\n \"note-remove\",\n \"note-remove-outline\",\n \"note-search\",\n \"note-search-outline\",\n \"note-text\",\n \"note-text-outline\",\n \"notebook\",\n \"notebook-check\",\n \"notebook-check-outline\",\n \"notebook-edit\",\n \"notebook-edit-outline\",\n \"notebook-heart\",\n \"notebook-heart-outline\",\n \"notebook-minus\",\n \"notebook-minus-outline\",\n \"notebook-multiple\",\n \"notebook-outline\",\n \"notebook-plus\",\n \"notebook-plus-outline\",\n \"notebook-remove\",\n \"notebook-remove-outline\",\n \"notification-clear-all\",\n \"npm\",\n \"nuke\",\n \"null\",\n \"numeric\",\n \"numeric-0\",\n \"numeric-0-box\",\n \"numeric-0-box-multiple\",\n \"numeric-0-box-multiple-outline\",\n \"numeric-0-box-outline\",\n \"numeric-0-circle\",\n \"numeric-0-circle-outline\",\n \"numeric-1\",\n \"numeric-1-box\",\n \"numeric-1-box-multiple\",\n \"numeric-1-box-multiple-outline\",\n \"numeric-1-box-outline\",\n \"numeric-1-circle\",\n \"numeric-1-circle-outline\",\n \"numeric-10\",\n \"numeric-10-box\",\n \"numeric-10-box-multiple\",\n \"numeric-10-box-multiple-outline\",\n \"numeric-10-box-outline\",\n \"numeric-10-circle\",\n \"numeric-10-circle-outline\",\n \"numeric-2\",\n \"numeric-2-box\",\n \"numeric-2-box-multiple\",\n \"numeric-2-box-multiple-outline\",\n \"numeric-2-box-outline\",\n \"numeric-2-circle\",\n \"numeric-2-circle-outline\",\n \"numeric-3\",\n \"numeric-3-box\",\n \"numeric-3-box-multiple\",\n \"numeric-3-box-multiple-outline\",\n \"numeric-3-box-outline\",\n \"numeric-3-circle\",\n \"numeric-3-circle-outline\",\n \"numeric-4\",\n \"numeric-4-box\",\n \"numeric-4-box-multiple\",\n \"numeric-4-box-multiple-outline\",\n \"numeric-4-box-outline\",\n \"numeric-4-circle\",\n \"numeric-4-circle-outline\",\n \"numeric-5\",\n \"numeric-5-box\",\n \"numeric-5-box-multiple\",\n \"numeric-5-box-multiple-outline\",\n \"numeric-5-box-outline\",\n \"numeric-5-circle\",\n \"numeric-5-circle-outline\",\n \"numeric-6\",\n \"numeric-6-box\",\n \"numeric-6-box-multiple\",\n \"numeric-6-box-multiple-outline\",\n \"numeric-6-box-outline\",\n \"numeric-6-circle\",\n \"numeric-6-circle-outline\",\n \"numeric-7\",\n \"numeric-7-box\",\n \"numeric-7-box-multiple\",\n \"numeric-7-box-multiple-outline\",\n \"numeric-7-box-outline\",\n \"numeric-7-circle\",\n \"numeric-7-circle-outline\",\n \"numeric-8\",\n \"numeric-8-box\",\n \"numeric-8-box-multiple\",\n \"numeric-8-box-multiple-outline\",\n \"numeric-8-box-outline\",\n \"numeric-8-circle\",\n \"numeric-8-circle-outline\",\n \"numeric-9\",\n \"numeric-9-box\",\n \"numeric-9-box-multiple\",\n \"numeric-9-box-multiple-outline\",\n \"numeric-9-box-outline\",\n \"numeric-9-circle\",\n \"numeric-9-circle-outline\",\n \"numeric-9-plus\",\n \"numeric-9-plus-box\",\n \"numeric-9-plus-box-multiple\",\n \"numeric-9-plus-box-multiple-outline\",\n \"numeric-9-plus-box-outline\",\n \"numeric-9-plus-circle\",\n \"numeric-9-plus-circle-outline\",\n \"numeric-negative-1\",\n \"numeric-off\",\n \"numeric-positive-1\",\n \"nut\",\n \"nutrition\",\n \"nuxt\",\n \"oar\",\n \"ocarina\",\n \"oci\",\n \"ocr\",\n \"octagon\",\n \"octagon-outline\",\n \"octagram\",\n \"octagram-edit\",\n \"octagram-edit-outline\",\n \"octagram-minus\",\n \"octagram-minus-outline\",\n \"octagram-outline\",\n \"octagram-plus\",\n \"octagram-plus-outline\",\n \"octahedron\",\n \"octahedron-off\",\n \"odnoklassniki\",\n \"offer\",\n \"office-building\",\n \"office-building-cog\",\n \"office-building-cog-outline\",\n \"office-building-marker\",\n \"office-building-marker-outline\",\n \"office-building-minus\",\n \"office-building-minus-outline\",\n \"office-building-outline\",\n \"office-building-plus\",\n \"office-building-plus-outline\",\n \"office-building-remove\",\n \"office-building-remove-outline\",\n \"oil\",\n \"oil-lamp\",\n \"oil-level\",\n \"oil-temperature\",\n \"om\",\n \"omega\",\n \"one-up\",\n \"onepassword\",\n \"opacity\",\n \"open-in-app\",\n \"open-in-new\",\n \"open-source-initiative\",\n \"openid\",\n \"opera\",\n \"orbit\",\n \"orbit-variant\",\n \"order-alphabetical-ascending\",\n \"order-alphabetical-descending\",\n \"order-bool-ascending\",\n \"order-bool-ascending-variant\",\n \"order-bool-descending\",\n \"order-bool-descending-variant\",\n \"order-numeric-ascending\",\n \"order-numeric-descending\",\n \"origin\",\n \"ornament\",\n \"ornament-variant\",\n \"outdoor-lamp\",\n \"overscan\",\n \"owl\",\n \"pac-man\",\n \"package\",\n \"package-check\",\n \"package-down\",\n \"package-up\",\n \"package-variant\",\n \"package-variant-closed\",\n \"package-variant-closed-check\",\n \"package-variant-closed-minus\",\n \"package-variant-closed-plus\",\n \"package-variant-closed-remove\",\n \"package-variant-minus\",\n \"package-variant-plus\",\n \"package-variant-remove\",\n \"page-first\",\n \"page-last\",\n \"page-layout-body\",\n \"page-layout-footer\",\n \"page-layout-header\",\n \"page-layout-header-footer\",\n \"page-layout-sidebar-left\",\n \"page-layout-sidebar-right\",\n \"page-next\",\n \"page-next-outline\",\n \"page-previous\",\n \"page-previous-outline\",\n \"pail\",\n \"pail-minus\",\n \"pail-minus-outline\",\n \"pail-off\",\n \"pail-off-outline\",\n \"pail-outline\",\n \"pail-plus\",\n \"pail-plus-outline\",\n \"pail-remove\",\n \"pail-remove-outline\",\n \"palette\",\n \"palette-advanced\",\n \"palette-outline\",\n \"palette-swatch\",\n \"palette-swatch-outline\",\n \"palette-swatch-variant\",\n \"palm-tree\",\n \"pan\",\n \"pan-bottom-left\",\n \"pan-bottom-right\",\n \"pan-down\",\n \"pan-horizontal\",\n \"pan-left\",\n \"pan-right\",\n \"pan-top-left\",\n \"pan-top-right\",\n \"pan-up\",\n \"pan-vertical\",\n \"panda\",\n \"pandora\",\n \"panorama\",\n \"panorama-fisheye\",\n \"panorama-horizontal\",\n \"panorama-horizontal-outline\",\n \"panorama-outline\",\n \"panorama-sphere\",\n \"panorama-sphere-outline\",\n \"panorama-variant\",\n \"panorama-variant-outline\",\n \"panorama-vertical\",\n \"panorama-vertical-outline\",\n \"panorama-wide-angle\",\n \"panorama-wide-angle-outline\",\n \"paper-cut-vertical\",\n \"paper-roll\",\n \"paper-roll-outline\",\n \"paperclip\",\n \"paperclip-check\",\n \"paperclip-lock\",\n \"paperclip-minus\",\n \"paperclip-off\",\n \"paperclip-plus\",\n \"paperclip-remove\",\n \"parachute\",\n \"parachute-outline\",\n \"paragliding\",\n \"parking\",\n \"party-popper\",\n \"passport\",\n \"passport-alert\",\n \"passport-biometric\",\n \"passport-cancel\",\n \"passport-check\",\n \"passport-minus\",\n \"passport-plus\",\n \"passport-remove\",\n \"pasta\",\n \"patio-heater\",\n \"patreon\",\n \"pause\",\n \"pause-box\",\n \"pause-box-outline\",\n \"pause-circle\",\n \"pause-circle-outline\",\n \"pause-octagon\",\n \"pause-octagon-outline\",\n \"paw\",\n \"paw-off\",\n \"paw-off-outline\",\n \"paw-outline\",\n \"peace\",\n \"peanut\",\n \"peanut-off\",\n \"peanut-off-outline\",\n \"peanut-outline\",\n \"pen\",\n \"pen-lock\",\n \"pen-minus\",\n \"pen-off\",\n \"pen-plus\",\n \"pen-remove\",\n \"pencil\",\n \"pencil-box\",\n \"pencil-box-multiple\",\n \"pencil-box-multiple-outline\",\n \"pencil-box-outline\",\n \"pencil-circle\",\n \"pencil-circle-outline\",\n \"pencil-lock\",\n \"pencil-lock-outline\",\n \"pencil-minus\",\n \"pencil-minus-outline\",\n \"pencil-off\",\n \"pencil-off-outline\",\n \"pencil-outline\",\n \"pencil-plus\",\n \"pencil-plus-outline\",\n \"pencil-remove\",\n \"pencil-remove-outline\",\n \"pencil-ruler\",\n \"pencil-ruler-outline\",\n \"penguin\",\n \"pentagon\",\n \"pentagon-outline\",\n \"pentagram\",\n \"percent\",\n \"percent-box\",\n \"percent-box-outline\",\n \"percent-circle\",\n \"percent-circle-outline\",\n \"percent-outline\",\n \"periodic-table\",\n \"perspective-less\",\n \"perspective-more\",\n \"ph\",\n \"phone\",\n \"phone-alert\",\n \"phone-alert-outline\",\n \"phone-bluetooth\",\n \"phone-bluetooth-outline\",\n \"phone-cancel\",\n \"phone-cancel-outline\",\n \"phone-check\",\n \"phone-check-outline\",\n \"phone-classic\",\n \"phone-classic-off\",\n \"phone-clock\",\n \"phone-dial\",\n \"phone-dial-outline\",\n \"phone-forward\",\n \"phone-forward-outline\",\n \"phone-hangup\",\n \"phone-hangup-outline\",\n \"phone-in-talk\",\n \"phone-in-talk-outline\",\n \"phone-incoming\",\n \"phone-incoming-outgoing\",\n \"phone-incoming-outgoing-outline\",\n \"phone-incoming-outline\",\n \"phone-lock\",\n \"phone-lock-outline\",\n \"phone-log\",\n \"phone-log-outline\",\n \"phone-message\",\n \"phone-message-outline\",\n \"phone-minus\",\n \"phone-minus-outline\",\n \"phone-missed\",\n \"phone-missed-outline\",\n \"phone-off\",\n \"phone-off-outline\",\n \"phone-outgoing\",\n \"phone-outgoing-outline\",\n \"phone-outline\",\n \"phone-paused\",\n \"phone-paused-outline\",\n \"phone-plus\",\n \"phone-plus-outline\",\n \"phone-refresh\",\n \"phone-refresh-outline\",\n \"phone-remove\",\n \"phone-remove-outline\",\n \"phone-return\",\n \"phone-return-outline\",\n \"phone-ring\",\n \"phone-ring-outline\",\n \"phone-rotate-landscape\",\n \"phone-rotate-portrait\",\n \"phone-settings\",\n \"phone-settings-outline\",\n \"phone-sync\",\n \"phone-sync-outline\",\n \"phone-voip\",\n \"pi\",\n \"pi-box\",\n \"pi-hole\",\n \"piano\",\n \"piano-off\",\n \"pickaxe\",\n \"picture-in-picture-bottom-right\",\n \"picture-in-picture-bottom-right-outline\",\n \"picture-in-picture-top-right\",\n \"picture-in-picture-top-right-outline\",\n \"pier\",\n \"pier-crane\",\n \"pig\",\n \"pig-variant\",\n \"pig-variant-outline\",\n \"piggy-bank\",\n \"piggy-bank-outline\",\n \"pill\",\n \"pill-multiple\",\n \"pill-off\",\n \"pillar\",\n \"pin\",\n \"pin-off\",\n \"pin-off-outline\",\n \"pin-outline\",\n \"pine-tree\",\n \"pine-tree-box\",\n \"pine-tree-fire\",\n \"pine-tree-variant\",\n \"pine-tree-variant-outline\",\n \"pinterest\",\n \"pinwheel\",\n \"pinwheel-outline\",\n \"pipe\",\n \"pipe-disconnected\",\n \"pipe-leak\",\n \"pipe-valve\",\n \"pipe-wrench\",\n \"pirate\",\n \"pistol\",\n \"piston\",\n \"pitchfork\",\n \"pizza\",\n \"plane-car\",\n \"plane-train\",\n \"play\",\n \"play-box\",\n \"play-box-edit-outline\",\n \"play-box-lock\",\n \"play-box-lock-open\",\n \"play-box-lock-open-outline\",\n \"play-box-lock-outline\",\n \"play-box-multiple\",\n \"play-box-multiple-outline\",\n \"play-box-outline\",\n \"play-circle\",\n \"play-circle-outline\",\n \"play-network\",\n \"play-network-outline\",\n \"play-outline\",\n \"play-pause\",\n \"play-protected-content\",\n \"play-speed\",\n \"playlist-check\",\n \"playlist-edit\",\n \"playlist-minus\",\n \"playlist-music\",\n \"playlist-music-outline\",\n \"playlist-play\",\n \"playlist-plus\",\n \"playlist-remove\",\n \"playlist-star\",\n \"plex\",\n \"pliers\",\n \"plus\",\n \"plus-box\",\n \"plus-box-multiple\",\n \"plus-box-multiple-outline\",\n \"plus-box-outline\",\n \"plus-circle\",\n \"plus-circle-multiple\",\n \"plus-circle-multiple-outline\",\n \"plus-circle-outline\",\n \"plus-lock\",\n \"plus-lock-open\",\n \"plus-minus\",\n \"plus-minus-box\",\n \"plus-minus-variant\",\n \"plus-network\",\n \"plus-network-outline\",\n \"plus-outline\",\n \"plus-thick\",\n \"pocket\",\n \"podcast\",\n \"podium\",\n \"podium-bronze\",\n \"podium-gold\",\n \"podium-silver\",\n \"point-of-sale\",\n \"pokeball\",\n \"pokemon-go\",\n \"poker-chip\",\n \"polaroid\",\n \"police-badge\",\n \"police-badge-outline\",\n \"police-station\",\n \"poll\",\n \"polo\",\n \"polymer\",\n \"pool\",\n \"pool-thermometer\",\n \"popcorn\",\n \"post\",\n \"post-lamp\",\n \"post-outline\",\n \"postage-stamp\",\n \"pot\",\n \"pot-mix\",\n \"pot-mix-outline\",\n \"pot-outline\",\n \"pot-steam\",\n \"pot-steam-outline\",\n \"pound\",\n \"pound-box\",\n \"pound-box-outline\",\n \"power\",\n \"power-cycle\",\n \"power-off\",\n \"power-on\",\n \"power-plug\",\n \"power-plug-battery\",\n \"power-plug-battery-outline\",\n \"power-plug-off\",\n \"power-plug-off-outline\",\n \"power-plug-outline\",\n \"power-settings\",\n \"power-sleep\",\n \"power-socket\",\n \"power-socket-au\",\n \"power-socket-ch\",\n \"power-socket-de\",\n \"power-socket-eu\",\n \"power-socket-fr\",\n \"power-socket-it\",\n \"power-socket-jp\",\n \"power-socket-uk\",\n \"power-socket-us\",\n \"power-standby\",\n \"powershell\",\n \"prescription\",\n \"presentation\",\n \"presentation-play\",\n \"pretzel\",\n \"printer\",\n \"printer-3d\",\n \"printer-3d-nozzle\",\n \"printer-3d-nozzle-alert\",\n \"printer-3d-nozzle-alert-outline\",\n \"printer-3d-nozzle-heat\",\n \"printer-3d-nozzle-heat-outline\",\n \"printer-3d-nozzle-off\",\n \"printer-3d-nozzle-off-outline\",\n \"printer-3d-nozzle-outline\",\n \"printer-3d-off\",\n \"printer-alert\",\n \"printer-check\",\n \"printer-eye\",\n \"printer-off\",\n \"printer-off-outline\",\n \"printer-outline\",\n \"printer-pos\",\n \"printer-pos-alert\",\n \"printer-pos-alert-outline\",\n \"printer-pos-cancel\",\n \"printer-pos-cancel-outline\",\n \"printer-pos-check\",\n \"printer-pos-check-outline\",\n \"printer-pos-cog\",\n \"printer-pos-cog-outline\",\n \"printer-pos-edit\",\n \"printer-pos-edit-outline\",\n \"printer-pos-minus\",\n \"printer-pos-minus-outline\",\n \"printer-pos-network\",\n \"printer-pos-network-outline\",\n \"printer-pos-off\",\n \"printer-pos-off-outline\",\n \"printer-pos-outline\",\n \"printer-pos-pause\",\n \"printer-pos-pause-outline\",\n \"printer-pos-play\",\n \"printer-pos-play-outline\",\n \"printer-pos-plus\",\n \"printer-pos-plus-outline\",\n \"printer-pos-refresh\",\n \"printer-pos-refresh-outline\",\n \"printer-pos-remove\",\n \"printer-pos-remove-outline\",\n \"printer-pos-star\",\n \"printer-pos-star-outline\",\n \"printer-pos-stop\",\n \"printer-pos-stop-outline\",\n \"printer-pos-sync\",\n \"printer-pos-sync-outline\",\n \"printer-pos-wrench\",\n \"printer-pos-wrench-outline\",\n \"printer-search\",\n \"printer-settings\",\n \"printer-wireless\",\n \"priority-high\",\n \"priority-low\",\n \"professional-hexagon\",\n \"progress-alert\",\n \"progress-check\",\n \"progress-clock\",\n \"progress-close\",\n \"progress-download\",\n \"progress-helper\",\n \"progress-pencil\",\n \"progress-question\",\n \"progress-star\",\n \"progress-star-four-points\",\n \"progress-tag\",\n \"progress-upload\",\n \"progress-wrench\",\n \"projector\",\n \"projector-off\",\n \"projector-screen\",\n \"projector-screen-off\",\n \"projector-screen-off-outline\",\n \"projector-screen-outline\",\n \"projector-screen-variant\",\n \"projector-screen-variant-off\",\n \"projector-screen-variant-off-outline\",\n \"projector-screen-variant-outline\",\n \"propane-tank\",\n \"propane-tank-outline\",\n \"protocol\",\n \"publish\",\n \"publish-off\",\n \"pulse\",\n \"pump\",\n \"pump-off\",\n \"pumpkin\",\n \"purse\",\n \"purse-outline\",\n \"puzzle\",\n \"puzzle-check\",\n \"puzzle-check-outline\",\n \"puzzle-edit\",\n \"puzzle-edit-outline\",\n \"puzzle-heart\",\n \"puzzle-heart-outline\",\n \"puzzle-minus\",\n \"puzzle-minus-outline\",\n \"puzzle-outline\",\n \"puzzle-plus\",\n \"puzzle-plus-outline\",\n \"puzzle-remove\",\n \"puzzle-remove-outline\",\n \"puzzle-star\",\n \"puzzle-star-outline\",\n \"pyramid\",\n \"pyramid-off\",\n \"qi\",\n \"qqchat\",\n \"qrcode\",\n \"qrcode-edit\",\n \"qrcode-minus\",\n \"qrcode-plus\",\n \"qrcode-remove\",\n \"qrcode-scan\",\n \"quadcopter\",\n \"quality-high\",\n \"quality-low\",\n \"quality-medium\",\n \"queue-first-in-last-out\",\n \"quora\",\n \"rabbit\",\n \"rabbit-variant\",\n \"rabbit-variant-outline\",\n \"racing-helmet\",\n \"racquetball\",\n \"radar\",\n \"radiator\",\n \"radiator-disabled\",\n \"radiator-off\",\n \"radio\",\n \"radio-am\",\n \"radio-fm\",\n \"radio-handheld\",\n \"radio-off\",\n \"radio-tower\",\n \"radioactive\",\n \"radioactive-circle\",\n \"radioactive-circle-outline\",\n \"radioactive-off\",\n \"radiobox-blank\",\n \"radiobox-indeterminate-variant\",\n \"radiobox-marked\",\n \"radiology-box\",\n \"radiology-box-outline\",\n \"radius\",\n \"radius-outline\",\n \"railroad-light\",\n \"rake\",\n \"raspberry-pi\",\n \"raw\",\n \"raw-off\",\n \"ray-end\",\n \"ray-end-arrow\",\n \"ray-start\",\n \"ray-start-arrow\",\n \"ray-start-end\",\n \"ray-start-vertex-end\",\n \"ray-vertex\",\n \"razor-double-edge\",\n \"razor-single-edge\",\n \"react\",\n \"read\",\n \"receipt\",\n \"receipt-clock\",\n \"receipt-clock-outline\",\n \"receipt-outline\",\n \"receipt-send\",\n \"receipt-send-outline\",\n \"receipt-text\",\n \"receipt-text-arrow-left\",\n \"receipt-text-arrow-left-outline\",\n \"receipt-text-arrow-right\",\n \"receipt-text-arrow-right-outline\",\n \"receipt-text-check\",\n \"receipt-text-check-outline\",\n \"receipt-text-clock\",\n \"receipt-text-clock-outline\",\n \"receipt-text-edit\",\n \"receipt-text-edit-outline\",\n \"receipt-text-minus\",\n \"receipt-text-minus-outline\",\n \"receipt-text-outline\",\n \"receipt-text-plus\",\n \"receipt-text-plus-outline\",\n \"receipt-text-remove\",\n \"receipt-text-remove-outline\",\n \"receipt-text-send\",\n \"receipt-text-send-outline\",\n \"record\",\n \"record-circle\",\n \"record-circle-outline\",\n \"record-player\",\n \"record-rec\",\n \"rectangle\",\n \"rectangle-outline\",\n \"recycle\",\n \"recycle-variant\",\n \"reddit\",\n \"redhat\",\n \"redo\",\n \"redo-variant\",\n \"reflect-horizontal\",\n \"reflect-vertical\",\n \"refresh\",\n \"refresh-auto\",\n \"refresh-circle\",\n \"regex\",\n \"registered-trademark\",\n \"reiterate\",\n \"relation-many-to-many\",\n \"relation-many-to-one\",\n \"relation-many-to-one-or-many\",\n \"relation-many-to-only-one\",\n \"relation-many-to-zero-or-many\",\n \"relation-many-to-zero-or-one\",\n \"relation-one-or-many-to-many\",\n \"relation-one-or-many-to-one\",\n \"relation-one-or-many-to-one-or-many\",\n \"relation-one-or-many-to-only-one\",\n \"relation-one-or-many-to-zero-or-many\",\n \"relation-one-or-many-to-zero-or-one\",\n \"relation-one-to-many\",\n \"relation-one-to-one\",\n \"relation-one-to-one-or-many\",\n \"relation-one-to-only-one\",\n \"relation-one-to-zero-or-many\",\n \"relation-one-to-zero-or-one\",\n \"relation-only-one-to-many\",\n \"relation-only-one-to-one\",\n \"relation-only-one-to-one-or-many\",\n \"relation-only-one-to-only-one\",\n \"relation-only-one-to-zero-or-many\",\n \"relation-only-one-to-zero-or-one\",\n \"relation-zero-or-many-to-many\",\n \"relation-zero-or-many-to-one\",\n \"relation-zero-or-many-to-one-or-many\",\n \"relation-zero-or-many-to-only-one\",\n \"relation-zero-or-many-to-zero-or-many\",\n \"relation-zero-or-many-to-zero-or-one\",\n \"relation-zero-or-one-to-many\",\n \"relation-zero-or-one-to-one\",\n \"relation-zero-or-one-to-one-or-many\",\n \"relation-zero-or-one-to-only-one\",\n \"relation-zero-or-one-to-zero-or-many\",\n \"relation-zero-or-one-to-zero-or-one\",\n \"relative-scale\",\n \"reload\",\n \"reload-alert\",\n \"reminder\",\n \"remote\",\n \"remote-desktop\",\n \"remote-off\",\n \"remote-tv\",\n \"remote-tv-off\",\n \"rename\",\n \"rename-box\",\n \"rename-box-outline\",\n \"rename-outline\",\n \"reorder-horizontal\",\n \"reorder-vertical\",\n \"repeat\",\n \"repeat-off\",\n \"repeat-once\",\n \"repeat-variant\",\n \"replay\",\n \"reply\",\n \"reply-all\",\n \"reply-all-outline\",\n \"reply-circle\",\n \"reply-outline\",\n \"reproduction\",\n \"resistor\",\n \"resistor-nodes\",\n \"resize\",\n \"resize-bottom-right\",\n \"responsive\",\n \"restart\",\n \"restart-alert\",\n \"restart-off\",\n \"restore\",\n \"restore-alert\",\n \"rewind\",\n \"rewind-10\",\n \"rewind-15\",\n \"rewind-30\",\n \"rewind-45\",\n \"rewind-5\",\n \"rewind-60\",\n \"rewind-outline\",\n \"rhombus\",\n \"rhombus-medium\",\n \"rhombus-medium-outline\",\n \"rhombus-outline\",\n \"rhombus-split\",\n \"rhombus-split-outline\",\n \"ribbon\",\n \"rice\",\n \"rickshaw\",\n \"rickshaw-electric\",\n \"ring\",\n \"rivet\",\n \"road\",\n \"road-variant\",\n \"robber\",\n \"robot\",\n \"robot-angry\",\n \"robot-angry-outline\",\n \"robot-confused\",\n \"robot-confused-outline\",\n \"robot-dead\",\n \"robot-dead-outline\",\n \"robot-excited\",\n \"robot-excited-outline\",\n \"robot-happy\",\n \"robot-happy-outline\",\n \"robot-industrial\",\n \"robot-industrial-outline\",\n \"robot-love\",\n \"robot-love-outline\",\n \"robot-mower\",\n \"robot-mower-outline\",\n \"robot-off\",\n \"robot-off-outline\",\n \"robot-outline\",\n \"robot-vacuum\",\n \"robot-vacuum-alert\",\n \"robot-vacuum-off\",\n \"robot-vacuum-variant\",\n \"robot-vacuum-variant-alert\",\n \"robot-vacuum-variant-off\",\n \"rocket\",\n \"rocket-launch\",\n \"rocket-launch-outline\",\n \"rocket-outline\",\n \"rodent\",\n \"roller-shade\",\n \"roller-shade-closed\",\n \"roller-skate\",\n \"roller-skate-off\",\n \"rollerblade\",\n \"rollerblade-off\",\n \"rollupjs\",\n \"rolodex\",\n \"rolodex-outline\",\n \"roman-numeral-1\",\n \"roman-numeral-10\",\n \"roman-numeral-2\",\n \"roman-numeral-3\",\n \"roman-numeral-4\",\n \"roman-numeral-5\",\n \"roman-numeral-6\",\n \"roman-numeral-7\",\n \"roman-numeral-8\",\n \"roman-numeral-9\",\n \"room-service\",\n \"room-service-outline\",\n \"rotate-360\",\n \"rotate-3d\",\n \"rotate-3d-variant\",\n \"rotate-left\",\n \"rotate-left-variant\",\n \"rotate-orbit\",\n \"rotate-right\",\n \"rotate-right-variant\",\n \"rounded-corner\",\n \"router\",\n \"router-network\",\n \"router-network-wireless\",\n \"router-wireless\",\n \"router-wireless-off\",\n \"router-wireless-settings\",\n \"routes\",\n \"routes-clock\",\n \"rowing\",\n \"rss\",\n \"rss-box\",\n \"rss-off\",\n \"rug\",\n \"rugby\",\n \"ruler\",\n \"ruler-square\",\n \"ruler-square-compass\",\n \"run\",\n \"run-fast\",\n \"rv-truck\",\n \"sack\",\n \"sack-outline\",\n \"sack-percent\",\n \"safe\",\n \"safe-square\",\n \"safe-square-outline\",\n \"safety-goggles\",\n \"sail-boat\",\n \"sail-boat-sink\",\n \"sale\",\n \"sale-outline\",\n \"salesforce\",\n \"sass\",\n \"satellite\",\n \"satellite-uplink\",\n \"satellite-variant\",\n \"sausage\",\n \"sausage-off\",\n \"saw-blade\",\n \"sawtooth-wave\",\n \"saxophone\",\n \"scale\",\n \"scale-balance\",\n \"scale-bathroom\",\n \"scale-off\",\n \"scale-unbalanced\",\n \"scan-helper\",\n \"scanner\",\n \"scanner-off\",\n \"scatter-plot\",\n \"scatter-plot-outline\",\n \"scent\",\n \"scent-off\",\n \"school\",\n \"school-outline\",\n \"scissors-cutting\",\n \"scooter\",\n \"scooter-electric\",\n \"scoreboard\",\n \"scoreboard-outline\",\n \"screen-rotation\",\n \"screen-rotation-lock\",\n \"screw-flat-top\",\n \"screw-lag\",\n \"screw-machine-flat-top\",\n \"screw-machine-round-top\",\n \"screw-round-top\",\n \"screwdriver\",\n \"script\",\n \"script-outline\",\n \"script-text\",\n \"script-text-key\",\n \"script-text-key-outline\",\n \"script-text-outline\",\n \"script-text-play\",\n \"script-text-play-outline\",\n \"sd\",\n \"seal\",\n \"seal-variant\",\n \"search-web\",\n \"seat\",\n \"seat-flat\",\n \"seat-flat-angled\",\n \"seat-individual-suite\",\n \"seat-legroom-extra\",\n \"seat-legroom-normal\",\n \"seat-legroom-reduced\",\n \"seat-outline\",\n \"seat-passenger\",\n \"seat-recline-extra\",\n \"seat-recline-normal\",\n \"seatbelt\",\n \"security\",\n \"security-network\",\n \"seed\",\n \"seed-off\",\n \"seed-off-outline\",\n \"seed-outline\",\n \"seed-plus\",\n \"seed-plus-outline\",\n \"seesaw\",\n \"segment\",\n \"select\",\n \"select-all\",\n \"select-arrow-down\",\n \"select-arrow-up\",\n \"select-color\",\n \"select-compare\",\n \"select-drag\",\n \"select-group\",\n \"select-inverse\",\n \"select-marker\",\n \"select-multiple\",\n \"select-multiple-marker\",\n \"select-off\",\n \"select-place\",\n \"select-remove\",\n \"select-search\",\n \"selection\",\n \"selection-drag\",\n \"selection-ellipse\",\n \"selection-ellipse-arrow-inside\",\n \"selection-ellipse-remove\",\n \"selection-marker\",\n \"selection-multiple\",\n \"selection-multiple-marker\",\n \"selection-off\",\n \"selection-remove\",\n \"selection-search\",\n \"semantic-web\",\n \"send\",\n \"send-check\",\n \"send-check-outline\",\n \"send-circle\",\n \"send-circle-outline\",\n \"send-clock\",\n \"send-clock-outline\",\n \"send-lock\",\n \"send-lock-outline\",\n \"send-outline\",\n \"send-variant\",\n \"send-variant-clock\",\n \"send-variant-clock-outline\",\n \"send-variant-outline\",\n \"serial-port\",\n \"server\",\n \"server-minus\",\n \"server-minus-outline\",\n \"server-network\",\n \"server-network-off\",\n \"server-network-outline\",\n \"server-off\",\n \"server-outline\",\n \"server-plus\",\n \"server-plus-outline\",\n \"server-remove\",\n \"server-security\",\n \"set-all\",\n \"set-center\",\n \"set-center-right\",\n \"set-left\",\n \"set-left-center\",\n \"set-left-right\",\n \"set-merge\",\n \"set-none\",\n \"set-right\",\n \"set-split\",\n \"set-square\",\n \"set-top-box\",\n \"settings-helper\",\n \"shaker\",\n \"shaker-outline\",\n \"shape\",\n \"shape-circle-plus\",\n \"shape-outline\",\n \"shape-oval-plus\",\n \"shape-plus\",\n \"shape-plus-outline\",\n \"shape-polygon-plus\",\n \"shape-rectangle-plus\",\n \"shape-square-plus\",\n \"shape-square-rounded-plus\",\n \"share\",\n \"share-all\",\n \"share-all-outline\",\n \"share-circle\",\n \"share-off\",\n \"share-off-outline\",\n \"share-outline\",\n \"share-variant\",\n \"share-variant-outline\",\n \"shark\",\n \"shark-fin\",\n \"shark-fin-outline\",\n \"shark-off\",\n \"sheep\",\n \"shield\",\n \"shield-account\",\n \"shield-account-outline\",\n \"shield-account-variant\",\n \"shield-account-variant-outline\",\n \"shield-airplane\",\n \"shield-airplane-outline\",\n \"shield-alert\",\n \"shield-alert-outline\",\n \"shield-bug\",\n \"shield-bug-outline\",\n \"shield-car\",\n \"shield-check\",\n \"shield-check-outline\",\n \"shield-cross\",\n \"shield-cross-outline\",\n \"shield-crown\",\n \"shield-crown-outline\",\n \"shield-edit\",\n \"shield-edit-outline\",\n \"shield-half\",\n \"shield-half-full\",\n \"shield-home\",\n \"shield-home-outline\",\n \"shield-key\",\n \"shield-key-outline\",\n \"shield-link-variant\",\n \"shield-link-variant-outline\",\n \"shield-lock\",\n \"shield-lock-open\",\n \"shield-lock-open-outline\",\n \"shield-lock-outline\",\n \"shield-moon\",\n \"shield-moon-outline\",\n \"shield-off\",\n \"shield-off-outline\",\n \"shield-outline\",\n \"shield-plus\",\n \"shield-plus-outline\",\n \"shield-refresh\",\n \"shield-refresh-outline\",\n \"shield-remove\",\n \"shield-remove-outline\",\n \"shield-search\",\n \"shield-star\",\n \"shield-star-outline\",\n \"shield-sun\",\n \"shield-sun-outline\",\n \"shield-sword\",\n \"shield-sword-outline\",\n \"shield-sync\",\n \"shield-sync-outline\",\n \"shimmer\",\n \"ship-wheel\",\n \"shipping-pallet\",\n \"shoe-ballet\",\n \"shoe-cleat\",\n \"shoe-formal\",\n \"shoe-heel\",\n \"shoe-print\",\n \"shoe-sneaker\",\n \"shopping\",\n \"shopping-music\",\n \"shopping-outline\",\n \"shopping-search\",\n \"shopping-search-outline\",\n \"shore\",\n \"shovel\",\n \"shovel-off\",\n \"shower\",\n \"shower-head\",\n \"shredder\",\n \"shuffle\",\n \"shuffle-disabled\",\n \"shuffle-variant\",\n \"shuriken\",\n \"sickle\",\n \"sigma\",\n \"sigma-lower\",\n \"sign-caution\",\n \"sign-direction\",\n \"sign-direction-minus\",\n \"sign-direction-plus\",\n \"sign-direction-remove\",\n \"sign-language\",\n \"sign-language-outline\",\n \"sign-pole\",\n \"sign-real-estate\",\n \"sign-text\",\n \"sign-yield\",\n \"signal\",\n \"signal-2g\",\n \"signal-3g\",\n \"signal-4g\",\n \"signal-5g\",\n \"signal-cellular-1\",\n \"signal-cellular-2\",\n \"signal-cellular-3\",\n \"signal-cellular-outline\",\n \"signal-distance-variant\",\n \"signal-hspa\",\n \"signal-hspa-plus\",\n \"signal-off\",\n \"signal-variant\",\n \"signature\",\n \"signature-freehand\",\n \"signature-image\",\n \"signature-text\",\n \"silo\",\n \"silo-outline\",\n \"silverware\",\n \"silverware-clean\",\n \"silverware-fork\",\n \"silverware-fork-knife\",\n \"silverware-spoon\",\n \"silverware-variant\",\n \"sim\",\n \"sim-alert\",\n \"sim-alert-outline\",\n \"sim-off\",\n \"sim-off-outline\",\n \"sim-outline\",\n \"simple-icons\",\n \"sina-weibo\",\n \"sine-wave\",\n \"sitemap\",\n \"sitemap-outline\",\n \"size-l\",\n \"size-m\",\n \"size-s\",\n \"size-xl\",\n \"size-xs\",\n \"size-xxl\",\n \"size-xxs\",\n \"size-xxxl\",\n \"skate\",\n \"skate-off\",\n \"skateboard\",\n \"skateboarding\",\n \"skew-less\",\n \"skew-more\",\n \"ski\",\n \"ski-cross-country\",\n \"ski-water\",\n \"skip-backward\",\n \"skip-backward-outline\",\n \"skip-forward\",\n \"skip-forward-outline\",\n \"skip-next\",\n \"skip-next-circle\",\n \"skip-next-circle-outline\",\n \"skip-next-outline\",\n \"skip-previous\",\n \"skip-previous-circle\",\n \"skip-previous-circle-outline\",\n \"skip-previous-outline\",\n \"skull\",\n \"skull-crossbones\",\n \"skull-crossbones-outline\",\n \"skull-outline\",\n \"skull-scan\",\n \"skull-scan-outline\",\n \"skype\",\n \"skype-business\",\n \"slack\",\n \"slash-forward\",\n \"slash-forward-box\",\n \"sledding\",\n \"sleep\",\n \"sleep-off\",\n \"slide\",\n \"slope-downhill\",\n \"slope-uphill\",\n \"slot-machine\",\n \"slot-machine-outline\",\n \"smart-card\",\n \"smart-card-off\",\n \"smart-card-off-outline\",\n \"smart-card-outline\",\n \"smart-card-reader\",\n \"smart-card-reader-outline\",\n \"smog\",\n \"smoke\",\n \"smoke-detector\",\n \"smoke-detector-alert\",\n \"smoke-detector-alert-outline\",\n \"smoke-detector-off\",\n \"smoke-detector-off-outline\",\n \"smoke-detector-outline\",\n \"smoke-detector-variant\",\n \"smoke-detector-variant-alert\",\n \"smoke-detector-variant-off\",\n \"smoking\",\n \"smoking-off\",\n \"smoking-pipe\",\n \"smoking-pipe-off\",\n \"snail\",\n \"snake\",\n \"snapchat\",\n \"snowboard\",\n \"snowflake\",\n \"snowflake-alert\",\n \"snowflake-check\",\n \"snowflake-melt\",\n \"snowflake-off\",\n \"snowflake-thermometer\",\n \"snowflake-variant\",\n \"snowman\",\n \"snowmobile\",\n \"snowshoeing\",\n \"soccer\",\n \"soccer-field\",\n \"social-distance-2-meters\",\n \"social-distance-6-feet\",\n \"sofa\",\n \"sofa-outline\",\n \"sofa-single\",\n \"sofa-single-outline\",\n \"solar-panel\",\n \"solar-panel-large\",\n \"solar-power\",\n \"solar-power-variant\",\n \"solar-power-variant-outline\",\n \"soldering-iron\",\n \"solid\",\n \"sony-playstation\",\n \"sort\",\n \"sort-alphabetical-ascending\",\n \"sort-alphabetical-ascending-variant\",\n \"sort-alphabetical-descending\",\n \"sort-alphabetical-descending-variant\",\n \"sort-alphabetical-variant\",\n \"sort-ascending\",\n \"sort-bool-ascending\",\n \"sort-bool-ascending-variant\",\n \"sort-bool-descending\",\n \"sort-bool-descending-variant\",\n \"sort-calendar-ascending\",\n \"sort-calendar-descending\",\n \"sort-clock-ascending\",\n \"sort-clock-ascending-outline\",\n \"sort-clock-descending\",\n \"sort-clock-descending-outline\",\n \"sort-descending\",\n \"sort-numeric-ascending\",\n \"sort-numeric-ascending-variant\",\n \"sort-numeric-descending\",\n \"sort-numeric-descending-variant\",\n \"sort-numeric-variant\",\n \"sort-reverse-variant\",\n \"sort-variant\",\n \"sort-variant-lock\",\n \"sort-variant-lock-open\",\n \"sort-variant-off\",\n \"sort-variant-remove\",\n \"soundbar\",\n \"soundcloud\",\n \"source-branch\",\n \"source-branch-check\",\n \"source-branch-minus\",\n \"source-branch-plus\",\n \"source-branch-refresh\",\n \"source-branch-remove\",\n \"source-branch-sync\",\n \"source-commit\",\n \"source-commit-end\",\n \"source-commit-end-local\",\n \"source-commit-local\",\n \"source-commit-next-local\",\n \"source-commit-start\",\n \"source-commit-start-next-local\",\n \"source-fork\",\n \"source-merge\",\n \"source-pull\",\n \"source-repository\",\n \"source-repository-multiple\",\n \"soy-sauce\",\n \"soy-sauce-off\",\n \"spa\",\n \"spa-outline\",\n \"space-invaders\",\n \"space-station\",\n \"spade\",\n \"speaker\",\n \"speaker-bluetooth\",\n \"speaker-message\",\n \"speaker-multiple\",\n \"speaker-off\",\n \"speaker-pause\",\n \"speaker-play\",\n \"speaker-stop\",\n \"speaker-wireless\",\n \"spear\",\n \"speedometer\",\n \"speedometer-medium\",\n \"speedometer-slow\",\n \"spellcheck\",\n \"sphere\",\n \"sphere-off\",\n \"spider\",\n \"spider-outline\",\n \"spider-thread\",\n \"spider-web\",\n \"spirit-level\",\n \"spoon-sugar\",\n \"spotify\",\n \"spotlight\",\n \"spotlight-beam\",\n \"spray\",\n \"spray-bottle\",\n \"sprinkler\",\n \"sprinkler-fire\",\n \"sprinkler-variant\",\n \"sprout\",\n \"sprout-outline\",\n \"square\",\n \"square-circle\",\n \"square-circle-outline\",\n \"square-edit-outline\",\n \"square-medium\",\n \"square-medium-outline\",\n \"square-off\",\n \"square-off-outline\",\n \"square-opacity\",\n \"square-outline\",\n \"square-root\",\n \"square-root-box\",\n \"square-rounded\",\n \"square-rounded-badge\",\n \"square-rounded-badge-outline\",\n \"square-rounded-outline\",\n \"square-small\",\n \"square-wave\",\n \"squeegee\",\n \"ssh\",\n \"stack-exchange\",\n \"stack-overflow\",\n \"stackpath\",\n \"stadium\",\n \"stadium-outline\",\n \"stadium-variant\",\n \"stairs\",\n \"stairs-box\",\n \"stairs-down\",\n \"stairs-up\",\n \"stamper\",\n \"standard-definition\",\n \"star\",\n \"star-box\",\n \"star-box-multiple\",\n \"star-box-multiple-outline\",\n \"star-box-outline\",\n \"star-check\",\n \"star-check-outline\",\n \"star-circle\",\n \"star-circle-outline\",\n \"star-cog\",\n \"star-cog-outline\",\n \"star-crescent\",\n \"star-david\",\n \"star-face\",\n \"star-four-points\",\n \"star-four-points-box\",\n \"star-four-points-box-outline\",\n \"star-four-points-circle\",\n \"star-four-points-circle-outline\",\n \"star-four-points-outline\",\n \"star-four-points-small\",\n \"star-half\",\n \"star-half-full\",\n \"star-minus\",\n \"star-minus-outline\",\n \"star-off\",\n \"star-off-outline\",\n \"star-outline\",\n \"star-plus\",\n \"star-plus-outline\",\n \"star-remove\",\n \"star-remove-outline\",\n \"star-settings\",\n \"star-settings-outline\",\n \"star-shooting\",\n \"star-shooting-outline\",\n \"star-three-points\",\n \"star-three-points-outline\",\n \"state-machine\",\n \"steam\",\n \"steering\",\n \"steering-off\",\n \"step-backward\",\n \"step-backward-2\",\n \"step-forward\",\n \"step-forward-2\",\n \"stethoscope\",\n \"sticker\",\n \"sticker-alert\",\n \"sticker-alert-outline\",\n \"sticker-check\",\n \"sticker-check-outline\",\n \"sticker-circle-outline\",\n \"sticker-emoji\",\n \"sticker-minus\",\n \"sticker-minus-outline\",\n \"sticker-outline\",\n \"sticker-plus\",\n \"sticker-plus-outline\",\n \"sticker-remove\",\n \"sticker-remove-outline\",\n \"sticker-text\",\n \"sticker-text-outline\",\n \"stocking\",\n \"stomach\",\n \"stool\",\n \"stool-outline\",\n \"stop\",\n \"stop-circle\",\n \"stop-circle-outline\",\n \"storage-tank\",\n \"storage-tank-outline\",\n \"store\",\n \"store-24-hour\",\n \"store-alert\",\n \"store-alert-outline\",\n \"store-check\",\n \"store-check-outline\",\n \"store-clock\",\n \"store-clock-outline\",\n \"store-cog\",\n \"store-cog-outline\",\n \"store-edit\",\n \"store-edit-outline\",\n \"store-marker\",\n \"store-marker-outline\",\n \"store-minus\",\n \"store-minus-outline\",\n \"store-off\",\n \"store-off-outline\",\n \"store-outline\",\n \"store-plus\",\n \"store-plus-outline\",\n \"store-remove\",\n \"store-remove-outline\",\n \"store-search\",\n \"store-search-outline\",\n \"store-settings\",\n \"store-settings-outline\",\n \"storefront\",\n \"storefront-check\",\n \"storefront-check-outline\",\n \"storefront-edit\",\n \"storefront-edit-outline\",\n \"storefront-minus\",\n \"storefront-minus-outline\",\n \"storefront-outline\",\n \"storefront-plus\",\n \"storefront-plus-outline\",\n \"storefront-remove\",\n \"storefront-remove-outline\",\n \"stove\",\n \"strategy\",\n \"stretch-to-page\",\n \"stretch-to-page-outline\",\n \"string-lights\",\n \"string-lights-off\",\n \"subdirectory-arrow-left\",\n \"subdirectory-arrow-right\",\n \"submarine\",\n \"subtitles\",\n \"subtitles-outline\",\n \"subway\",\n \"subway-alert-variant\",\n \"subway-variant\",\n \"summit\",\n \"sun-angle\",\n \"sun-angle-outline\",\n \"sun-clock\",\n \"sun-clock-outline\",\n \"sun-compass\",\n \"sun-snowflake\",\n \"sun-snowflake-variant\",\n \"sun-thermometer\",\n \"sun-thermometer-outline\",\n \"sun-wireless\",\n \"sun-wireless-outline\",\n \"sunglasses\",\n \"surfing\",\n \"surround-sound\",\n \"surround-sound-2-0\",\n \"surround-sound-2-1\",\n \"surround-sound-3-1\",\n \"surround-sound-5-1\",\n \"surround-sound-5-1-2\",\n \"surround-sound-7-1\",\n \"svg\",\n \"swap-horizontal\",\n \"swap-horizontal-bold\",\n \"swap-horizontal-circle\",\n \"swap-horizontal-circle-outline\",\n \"swap-horizontal-hidden\",\n \"swap-horizontal-variant\",\n \"swap-vertical\",\n \"swap-vertical-bold\",\n \"swap-vertical-circle\",\n \"swap-vertical-circle-outline\",\n \"swap-vertical-variant\",\n \"swim\",\n \"switch\",\n \"sword\",\n \"sword-cross\",\n \"syllabary-hangul\",\n \"syllabary-hiragana\",\n \"syllabary-katakana\",\n \"syllabary-katakana-halfwidth\",\n \"symbol\",\n \"symfony\",\n \"synagogue\",\n \"synagogue-outline\",\n \"sync\",\n \"sync-alert\",\n \"sync-circle\",\n \"sync-off\",\n \"tab\",\n \"tab-minus\",\n \"tab-plus\",\n \"tab-remove\",\n \"tab-search\",\n \"tab-unselected\",\n \"table\",\n \"table-account\",\n \"table-alert\",\n \"table-arrow-down\",\n \"table-arrow-left\",\n \"table-arrow-right\",\n \"table-arrow-up\",\n \"table-border\",\n \"table-cancel\",\n \"table-chair\",\n \"table-check\",\n \"table-clock\",\n \"table-cog\",\n \"table-column\",\n \"table-column-plus-after\",\n \"table-column-plus-before\",\n \"table-column-remove\",\n \"table-column-width\",\n \"table-edit\",\n \"table-eye\",\n \"table-eye-off\",\n \"table-filter\",\n \"table-furniture\",\n \"table-headers-eye\",\n \"table-headers-eye-off\",\n \"table-heart\",\n \"table-key\",\n \"table-large\",\n \"table-large-plus\",\n \"table-large-remove\",\n \"table-lock\",\n \"table-merge-cells\",\n \"table-minus\",\n \"table-multiple\",\n \"table-network\",\n \"table-of-contents\",\n \"table-off\",\n \"table-picnic\",\n \"table-pivot\",\n \"table-plus\",\n \"table-question\",\n \"table-refresh\",\n \"table-remove\",\n \"table-row\",\n \"table-row-height\",\n \"table-row-plus-after\",\n \"table-row-plus-before\",\n \"table-row-remove\",\n \"table-search\",\n \"table-settings\",\n \"table-split-cell\",\n \"table-star\",\n \"table-sync\",\n \"table-tennis\",\n \"tablet\",\n \"tablet-cellphone\",\n \"tablet-dashboard\",\n \"taco\",\n \"tag\",\n \"tag-arrow-down\",\n \"tag-arrow-down-outline\",\n \"tag-arrow-left\",\n \"tag-arrow-left-outline\",\n \"tag-arrow-right\",\n \"tag-arrow-right-outline\",\n \"tag-arrow-up\",\n \"tag-arrow-up-outline\",\n \"tag-check\",\n \"tag-check-outline\",\n \"tag-edit\",\n \"tag-edit-outline\",\n \"tag-faces\",\n \"tag-heart\",\n \"tag-heart-outline\",\n \"tag-hidden\",\n \"tag-minus\",\n \"tag-minus-outline\",\n \"tag-multiple\",\n \"tag-multiple-outline\",\n \"tag-off\",\n \"tag-off-outline\",\n \"tag-outline\",\n \"tag-plus\",\n \"tag-plus-outline\",\n \"tag-remove\",\n \"tag-remove-outline\",\n \"tag-search\",\n \"tag-search-outline\",\n \"tag-text\",\n \"tag-text-outline\",\n \"tailwind\",\n \"tally-mark-1\",\n \"tally-mark-2\",\n \"tally-mark-3\",\n \"tally-mark-4\",\n \"tally-mark-5\",\n \"tangram\",\n \"tank\",\n \"tanker-truck\",\n \"tape-drive\",\n \"tape-measure\",\n \"target\",\n \"target-account\",\n \"target-variant\",\n \"taxi\",\n \"tea\",\n \"tea-outline\",\n \"teamviewer\",\n \"teddy-bear\",\n \"telescope\",\n \"television\",\n \"television-ambient-light\",\n \"television-box\",\n \"television-classic\",\n \"television-classic-off\",\n \"television-guide\",\n \"television-off\",\n \"television-pause\",\n \"television-play\",\n \"television-shimmer\",\n \"television-speaker\",\n \"television-speaker-off\",\n \"television-stop\",\n \"temperature-celsius\",\n \"temperature-fahrenheit\",\n \"temperature-kelvin\",\n \"temple-buddhist\",\n \"temple-buddhist-outline\",\n \"temple-hindu\",\n \"temple-hindu-outline\",\n \"tennis\",\n \"tennis-ball\",\n \"tennis-ball-outline\",\n \"tent\",\n \"terraform\",\n \"terrain\",\n \"test-tube\",\n \"test-tube-empty\",\n \"test-tube-off\",\n \"text\",\n \"text-account\",\n \"text-box\",\n \"text-box-check\",\n \"text-box-check-outline\",\n \"text-box-edit\",\n \"text-box-edit-outline\",\n \"text-box-minus\",\n \"text-box-minus-outline\",\n \"text-box-multiple\",\n \"text-box-multiple-outline\",\n \"text-box-outline\",\n \"text-box-plus\",\n \"text-box-plus-outline\",\n \"text-box-remove\",\n \"text-box-remove-outline\",\n \"text-box-search\",\n \"text-box-search-outline\",\n \"text-long\",\n \"text-recognition\",\n \"text-search\",\n \"text-search-variant\",\n \"text-shadow\",\n \"text-short\",\n \"texture\",\n \"texture-box\",\n \"theater\",\n \"theme-light-dark\",\n \"thermometer\",\n \"thermometer-alert\",\n \"thermometer-auto\",\n \"thermometer-bluetooth\",\n \"thermometer-check\",\n \"thermometer-chevron-down\",\n \"thermometer-chevron-up\",\n \"thermometer-high\",\n \"thermometer-lines\",\n \"thermometer-low\",\n \"thermometer-minus\",\n \"thermometer-off\",\n \"thermometer-plus\",\n \"thermometer-probe\",\n \"thermometer-probe-off\",\n \"thermometer-water\",\n \"thermostat\",\n \"thermostat-auto\",\n \"thermostat-box\",\n \"thermostat-box-auto\",\n \"thermostat-cog\",\n \"thought-bubble\",\n \"thought-bubble-outline\",\n \"thumb-down\",\n \"thumb-down-outline\",\n \"thumb-up\",\n \"thumb-up-outline\",\n \"thumbs-up-down\",\n \"thumbs-up-down-outline\",\n \"ticket\",\n \"ticket-account\",\n \"ticket-confirmation\",\n \"ticket-confirmation-outline\",\n \"ticket-outline\",\n \"ticket-percent\",\n \"ticket-percent-outline\",\n \"tie\",\n \"tilde\",\n \"tilde-off\",\n \"timelapse\",\n \"timeline\",\n \"timeline-alert\",\n \"timeline-alert-outline\",\n \"timeline-check\",\n \"timeline-check-outline\",\n \"timeline-clock\",\n \"timeline-clock-outline\",\n \"timeline-minus\",\n \"timeline-minus-outline\",\n \"timeline-outline\",\n \"timeline-plus\",\n \"timeline-plus-outline\",\n \"timeline-question\",\n \"timeline-question-outline\",\n \"timeline-remove\",\n \"timeline-remove-outline\",\n \"timeline-text\",\n \"timeline-text-outline\",\n \"timer\",\n \"timer-10\",\n \"timer-3\",\n \"timer-alert\",\n \"timer-alert-outline\",\n \"timer-cancel\",\n \"timer-cancel-outline\",\n \"timer-check\",\n \"timer-check-outline\",\n \"timer-cog\",\n \"timer-cog-outline\",\n \"timer-edit\",\n \"timer-edit-outline\",\n \"timer-lock\",\n \"timer-lock-open\",\n \"timer-lock-open-outline\",\n \"timer-lock-outline\",\n \"timer-marker\",\n \"timer-marker-outline\",\n \"timer-minus\",\n \"timer-minus-outline\",\n \"timer-music\",\n \"timer-music-outline\",\n \"timer-off\",\n \"timer-off-outline\",\n \"timer-outline\",\n \"timer-pause\",\n \"timer-pause-outline\",\n \"timer-play\",\n \"timer-play-outline\",\n \"timer-plus\",\n \"timer-plus-outline\",\n \"timer-refresh\",\n \"timer-refresh-outline\",\n \"timer-remove\",\n \"timer-remove-outline\",\n \"timer-sand\",\n \"timer-sand-complete\",\n \"timer-sand-empty\",\n \"timer-sand-full\",\n \"timer-sand-paused\",\n \"timer-settings\",\n \"timer-settings-outline\",\n \"timer-star\",\n \"timer-star-outline\",\n \"timer-stop\",\n \"timer-stop-outline\",\n \"timer-sync\",\n \"timer-sync-outline\",\n \"timetable\",\n \"tire\",\n \"toaster\",\n \"toaster-off\",\n \"toaster-oven\",\n \"toggle-switch\",\n \"toggle-switch-off\",\n \"toggle-switch-off-outline\",\n \"toggle-switch-outline\",\n \"toggle-switch-variant\",\n \"toggle-switch-variant-off\",\n \"toilet\",\n \"toolbox\",\n \"toolbox-outline\",\n \"tools\",\n \"tooltip\",\n \"tooltip-account\",\n \"tooltip-cellphone\",\n \"tooltip-check\",\n \"tooltip-check-outline\",\n \"tooltip-edit\",\n \"tooltip-edit-outline\",\n \"tooltip-image\",\n \"tooltip-image-outline\",\n \"tooltip-minus\",\n \"tooltip-minus-outline\",\n \"tooltip-outline\",\n \"tooltip-plus\",\n \"tooltip-plus-outline\",\n \"tooltip-question\",\n \"tooltip-question-outline\",\n \"tooltip-remove\",\n \"tooltip-remove-outline\",\n \"tooltip-text\",\n \"tooltip-text-outline\",\n \"tooth\",\n \"tooth-outline\",\n \"toothbrush\",\n \"toothbrush-electric\",\n \"toothbrush-paste\",\n \"torch\",\n \"tortoise\",\n \"toslink\",\n \"touch-text-outline\",\n \"tournament\",\n \"tow-truck\",\n \"tower-beach\",\n \"tower-fire\",\n \"town-hall\",\n \"toy-brick\",\n \"toy-brick-marker\",\n \"toy-brick-marker-outline\",\n \"toy-brick-minus\",\n \"toy-brick-minus-outline\",\n \"toy-brick-outline\",\n \"toy-brick-plus\",\n \"toy-brick-plus-outline\",\n \"toy-brick-remove\",\n \"toy-brick-remove-outline\",\n \"toy-brick-search\",\n \"toy-brick-search-outline\",\n \"track-light\",\n \"track-light-off\",\n \"trackpad\",\n \"trackpad-lock\",\n \"tractor\",\n \"tractor-variant\",\n \"trademark\",\n \"traffic-cone\",\n \"traffic-light\",\n \"traffic-light-outline\",\n \"train\",\n \"train-bus\",\n \"train-car\",\n \"train-car-autorack\",\n \"train-car-box\",\n \"train-car-box-full\",\n \"train-car-box-open\",\n \"train-car-caboose\",\n \"train-car-centerbeam\",\n \"train-car-centerbeam-full\",\n \"train-car-container\",\n \"train-car-flatbed\",\n \"train-car-flatbed-car\",\n \"train-car-flatbed-tank\",\n \"train-car-gondola\",\n \"train-car-gondola-full\",\n \"train-car-hopper\",\n \"train-car-hopper-covered\",\n \"train-car-hopper-full\",\n \"train-car-intermodal\",\n \"train-car-passenger\",\n \"train-car-passenger-door\",\n \"train-car-passenger-door-open\",\n \"train-car-passenger-variant\",\n \"train-car-tank\",\n \"train-variant\",\n \"tram\",\n \"tram-side\",\n \"transcribe\",\n \"transcribe-close\",\n \"transfer\",\n \"transfer-down\",\n \"transfer-left\",\n \"transfer-right\",\n \"transfer-up\",\n \"transit-connection\",\n \"transit-connection-horizontal\",\n \"transit-connection-variant\",\n \"transit-detour\",\n \"transit-skip\",\n \"transit-transfer\",\n \"transition\",\n \"transition-masked\",\n \"translate\",\n \"translate-off\",\n \"translate-variant\",\n \"transmission-tower\",\n \"transmission-tower-export\",\n \"transmission-tower-import\",\n \"transmission-tower-off\",\n \"trash-can\",\n \"trash-can-outline\",\n \"tray\",\n \"tray-alert\",\n \"tray-arrow-down\",\n \"tray-arrow-up\",\n \"tray-full\",\n \"tray-minus\",\n \"tray-plus\",\n \"tray-remove\",\n \"treasure-chest\",\n \"treasure-chest-outline\",\n \"tree\",\n \"tree-outline\",\n \"trello\",\n \"trending-down\",\n \"trending-neutral\",\n \"trending-up\",\n \"triangle\",\n \"triangle-down\",\n \"triangle-down-outline\",\n \"triangle-outline\",\n \"triangle-small-down\",\n \"triangle-small-up\",\n \"triangle-wave\",\n \"triforce\",\n \"trophy\",\n \"trophy-award\",\n \"trophy-broken\",\n \"trophy-outline\",\n \"trophy-variant\",\n \"trophy-variant-outline\",\n \"truck\",\n \"truck-alert\",\n \"truck-alert-outline\",\n \"truck-cargo-container\",\n \"truck-check\",\n \"truck-check-outline\",\n \"truck-delivery\",\n \"truck-delivery-outline\",\n \"truck-fast\",\n \"truck-fast-outline\",\n \"truck-flatbed\",\n \"truck-minus\",\n \"truck-minus-outline\",\n \"truck-off-road\",\n \"truck-off-road-off\",\n \"truck-outline\",\n \"truck-plus\",\n \"truck-plus-outline\",\n \"truck-remove\",\n \"truck-remove-outline\",\n \"truck-snowflake\",\n \"truck-trailer\",\n \"trumpet\",\n \"tshirt-crew\",\n \"tshirt-crew-outline\",\n \"tshirt-v\",\n \"tshirt-v-outline\",\n \"tsunami\",\n \"tumble-dryer\",\n \"tumble-dryer-alert\",\n \"tumble-dryer-off\",\n \"tune\",\n \"tune-variant\",\n \"tune-vertical\",\n \"tune-vertical-variant\",\n \"tunnel\",\n \"tunnel-outline\",\n \"turbine\",\n \"turkey\",\n \"turnstile\",\n \"turnstile-outline\",\n \"turtle\",\n \"twitch\",\n \"twitter\",\n \"two-factor-authentication\",\n \"typewriter\",\n \"ubisoft\",\n \"ubuntu\",\n \"ufo\",\n \"ufo-outline\",\n \"ultra-high-definition\",\n \"umbraco\",\n \"umbrella\",\n \"umbrella-beach\",\n \"umbrella-beach-outline\",\n \"umbrella-closed\",\n \"umbrella-closed-outline\",\n \"umbrella-closed-variant\",\n \"umbrella-outline\",\n \"underwear-outline\",\n \"undo\",\n \"undo-variant\",\n \"unfold-less-horizontal\",\n \"unfold-less-vertical\",\n \"unfold-more-horizontal\",\n \"unfold-more-vertical\",\n \"ungroup\",\n \"unicode\",\n \"unicorn\",\n \"unicorn-variant\",\n \"unicycle\",\n \"unity\",\n \"unreal\",\n \"update\",\n \"upload\",\n \"upload-box\",\n \"upload-box-outline\",\n \"upload-circle\",\n \"upload-circle-outline\",\n \"upload-lock\",\n \"upload-lock-outline\",\n \"upload-multiple\",\n \"upload-multiple-outline\",\n \"upload-network\",\n \"upload-network-outline\",\n \"upload-off\",\n \"upload-off-outline\",\n \"upload-outline\",\n \"usb\",\n \"usb-c-port\",\n \"usb-flash-drive\",\n \"usb-flash-drive-outline\",\n \"usb-port\",\n \"vacuum\",\n \"vacuum-outline\",\n \"valve\",\n \"valve-closed\",\n \"valve-open\",\n \"van-passenger\",\n \"van-utility\",\n \"vanish\",\n \"vanish-quarter\",\n \"vanity-light\",\n \"variable\",\n \"variable-box\",\n \"vector-arrange-above\",\n \"vector-arrange-below\",\n \"vector-bezier\",\n \"vector-circle\",\n \"vector-circle-variant\",\n \"vector-combine\",\n \"vector-curve\",\n \"vector-difference\",\n \"vector-difference-ab\",\n \"vector-difference-ba\",\n \"vector-ellipse\",\n \"vector-intersection\",\n \"vector-line\",\n \"vector-link\",\n \"vector-point\",\n \"vector-point-edit\",\n \"vector-point-minus\",\n \"vector-point-plus\",\n \"vector-point-select\",\n \"vector-polygon\",\n \"vector-polygon-variant\",\n \"vector-polyline\",\n \"vector-polyline-edit\",\n \"vector-polyline-minus\",\n \"vector-polyline-plus\",\n \"vector-polyline-remove\",\n \"vector-radius\",\n \"vector-rectangle\",\n \"vector-selection\",\n \"vector-square\",\n \"vector-square-close\",\n \"vector-square-edit\",\n \"vector-square-minus\",\n \"vector-square-open\",\n \"vector-square-plus\",\n \"vector-square-remove\",\n \"vector-triangle\",\n \"vector-union\",\n \"vhs\",\n \"vibrate\",\n \"vibrate-off\",\n \"video\",\n \"video-2d\",\n \"video-3d\",\n \"video-3d-off\",\n \"video-3d-variant\",\n \"video-4k-box\",\n \"video-account\",\n \"video-box\",\n \"video-box-off\",\n \"video-check\",\n \"video-check-outline\",\n \"video-high-definition\",\n \"video-image\",\n \"video-input-antenna\",\n \"video-input-component\",\n \"video-input-hdmi\",\n \"video-input-scart\",\n \"video-input-svideo\",\n \"video-marker\",\n \"video-marker-outline\",\n \"video-minus\",\n \"video-minus-outline\",\n \"video-off\",\n \"video-off-outline\",\n \"video-outline\",\n \"video-plus\",\n \"video-plus-outline\",\n \"video-stabilization\",\n \"video-standard-definition\",\n \"video-switch\",\n \"video-switch-outline\",\n \"video-vintage\",\n \"video-wireless\",\n \"video-wireless-outline\",\n \"view-agenda\",\n \"view-agenda-outline\",\n \"view-array\",\n \"view-array-outline\",\n \"view-carousel\",\n \"view-carousel-outline\",\n \"view-column\",\n \"view-column-outline\",\n \"view-comfy\",\n \"view-comfy-outline\",\n \"view-compact\",\n \"view-compact-outline\",\n \"view-dashboard\",\n \"view-dashboard-edit\",\n \"view-dashboard-edit-outline\",\n \"view-dashboard-outline\",\n \"view-dashboard-variant\",\n \"view-dashboard-variant-outline\",\n \"view-day\",\n \"view-day-outline\",\n \"view-gallery\",\n \"view-gallery-outline\",\n \"view-grid\",\n \"view-grid-compact\",\n \"view-grid-outline\",\n \"view-grid-plus\",\n \"view-grid-plus-outline\",\n \"view-headline\",\n \"view-list\",\n \"view-list-outline\",\n \"view-module\",\n \"view-module-outline\",\n \"view-parallel\",\n \"view-parallel-outline\",\n \"view-quilt\",\n \"view-quilt-outline\",\n \"view-sequential\",\n \"view-sequential-outline\",\n \"view-split-horizontal\",\n \"view-split-vertical\",\n \"view-stream\",\n \"view-stream-outline\",\n \"view-week\",\n \"view-week-outline\",\n \"vimeo\",\n \"violin\",\n \"virtual-reality\",\n \"virus\",\n \"virus-off\",\n \"virus-off-outline\",\n \"virus-outline\",\n \"vlc\",\n \"voicemail\",\n \"volcano\",\n \"volcano-outline\",\n \"volleyball\",\n \"volume-equal\",\n \"volume-high\",\n \"volume-low\",\n \"volume-medium\",\n \"volume-minus\",\n \"volume-mute\",\n \"volume-off\",\n \"volume-plus\",\n \"volume-source\",\n \"volume-variant-off\",\n \"volume-vibrate\",\n \"vote\",\n \"vote-outline\",\n \"vpn\",\n \"vuejs\",\n \"vuetify\",\n \"walk\",\n \"wall\",\n \"wall-fire\",\n \"wall-sconce\",\n \"wall-sconce-flat\",\n \"wall-sconce-flat-outline\",\n \"wall-sconce-flat-variant\",\n \"wall-sconce-flat-variant-outline\",\n \"wall-sconce-outline\",\n \"wall-sconce-round\",\n \"wall-sconce-round-outline\",\n \"wall-sconce-round-variant\",\n \"wall-sconce-round-variant-outline\",\n \"wallet\",\n \"wallet-bifold\",\n \"wallet-bifold-outline\",\n \"wallet-giftcard\",\n \"wallet-membership\",\n \"wallet-outline\",\n \"wallet-plus\",\n \"wallet-plus-outline\",\n \"wallet-travel\",\n \"wallpaper\",\n \"wan\",\n \"wardrobe\",\n \"wardrobe-outline\",\n \"warehouse\",\n \"washing-machine\",\n \"washing-machine-alert\",\n \"washing-machine-off\",\n \"watch\",\n \"watch-export\",\n \"watch-export-variant\",\n \"watch-import\",\n \"watch-import-variant\",\n \"watch-variant\",\n \"watch-vibrate\",\n \"watch-vibrate-off\",\n \"water\",\n \"water-alert\",\n \"water-alert-outline\",\n \"water-boiler\",\n \"water-boiler-alert\",\n \"water-boiler-auto\",\n \"water-boiler-off\",\n \"water-check\",\n \"water-check-outline\",\n \"water-circle\",\n \"water-minus\",\n \"water-minus-outline\",\n \"water-off\",\n \"water-off-outline\",\n \"water-opacity\",\n \"water-outline\",\n \"water-percent\",\n \"water-percent-alert\",\n \"water-plus\",\n \"water-plus-outline\",\n \"water-polo\",\n \"water-pump\",\n \"water-pump-off\",\n \"water-remove\",\n \"water-remove-outline\",\n \"water-sync\",\n \"water-thermometer\",\n \"water-thermometer-outline\",\n \"water-well\",\n \"water-well-outline\",\n \"waterfall\",\n \"watering-can\",\n \"watering-can-outline\",\n \"watermark\",\n \"wave\",\n \"wave-arrow-down\",\n \"wave-arrow-up\",\n \"wave-undercurrent\",\n \"waveform\",\n \"waves\",\n \"waves-arrow-left\",\n \"waves-arrow-right\",\n \"waves-arrow-up\",\n \"waze\",\n \"weather-cloudy\",\n \"weather-cloudy-alert\",\n \"weather-cloudy-arrow-right\",\n \"weather-cloudy-clock\",\n \"weather-dust\",\n \"weather-fog\",\n \"weather-hail\",\n \"weather-hazy\",\n \"weather-hurricane\",\n \"weather-hurricane-outline\",\n \"weather-lightning\",\n \"weather-lightning-rainy\",\n \"weather-moonset\",\n \"weather-moonset-down\",\n \"weather-moonset-up\",\n \"weather-night\",\n \"weather-night-partly-cloudy\",\n \"weather-partly-cloudy\",\n \"weather-partly-lightning\",\n \"weather-partly-rainy\",\n \"weather-partly-snowy\",\n \"weather-partly-snowy-rainy\",\n \"weather-pouring\",\n \"weather-rainy\",\n \"weather-snowy\",\n \"weather-snowy-heavy\",\n \"weather-snowy-rainy\",\n \"weather-sunny\",\n \"weather-sunny-alert\",\n \"weather-sunny-off\",\n \"weather-sunset\",\n \"weather-sunset-down\",\n \"weather-sunset-up\",\n \"weather-tornado\",\n \"weather-windy\",\n \"weather-windy-variant\",\n \"web\",\n \"web-box\",\n \"web-cancel\",\n \"web-check\",\n \"web-clock\",\n \"web-minus\",\n \"web-off\",\n \"web-plus\",\n \"web-refresh\",\n \"web-remove\",\n \"web-sync\",\n \"webcam\",\n \"webcam-off\",\n \"webhook\",\n \"webpack\",\n \"webrtc\",\n \"wechat\",\n \"weight\",\n \"weight-gram\",\n \"weight-kilogram\",\n \"weight-lifter\",\n \"weight-pound\",\n \"whatsapp\",\n \"wheel-barrow\",\n \"wheelchair\",\n \"wheelchair-accessibility\",\n \"whistle\",\n \"whistle-outline\",\n \"white-balance-auto\",\n \"white-balance-incandescent\",\n \"white-balance-iridescent\",\n \"white-balance-sunny\",\n \"widgets\",\n \"widgets-outline\",\n \"wifi\",\n \"wifi-alert\",\n \"wifi-arrow-down\",\n \"wifi-arrow-left\",\n \"wifi-arrow-left-right\",\n \"wifi-arrow-right\",\n \"wifi-arrow-up\",\n \"wifi-arrow-up-down\",\n \"wifi-cancel\",\n \"wifi-check\",\n \"wifi-cog\",\n \"wifi-lock\",\n \"wifi-lock-open\",\n \"wifi-marker\",\n \"wifi-minus\",\n \"wifi-off\",\n \"wifi-plus\",\n \"wifi-refresh\",\n \"wifi-remove\",\n \"wifi-settings\",\n \"wifi-star\",\n \"wifi-strength-1\",\n \"wifi-strength-1-alert\",\n \"wifi-strength-1-lock\",\n \"wifi-strength-1-lock-open\",\n \"wifi-strength-2\",\n \"wifi-strength-2-alert\",\n \"wifi-strength-2-lock\",\n \"wifi-strength-2-lock-open\",\n \"wifi-strength-3\",\n \"wifi-strength-3-alert\",\n \"wifi-strength-3-lock\",\n \"wifi-strength-3-lock-open\",\n \"wifi-strength-4\",\n \"wifi-strength-4-alert\",\n \"wifi-strength-4-lock\",\n \"wifi-strength-4-lock-open\",\n \"wifi-strength-alert-outline\",\n \"wifi-strength-lock-open-outline\",\n \"wifi-strength-lock-outline\",\n \"wifi-strength-off\",\n \"wifi-strength-off-outline\",\n \"wifi-strength-outline\",\n \"wifi-sync\",\n \"wikipedia\",\n \"wind-power\",\n \"wind-power-outline\",\n \"wind-turbine\",\n \"wind-turbine-alert\",\n \"wind-turbine-check\",\n \"window-close\",\n \"window-closed\",\n \"window-closed-variant\",\n \"window-maximize\",\n \"window-minimize\",\n \"window-open\",\n \"window-open-variant\",\n \"window-restore\",\n \"window-shutter\",\n \"window-shutter-alert\",\n \"window-shutter-auto\",\n \"window-shutter-cog\",\n \"window-shutter-open\",\n \"window-shutter-settings\",\n \"windsock\",\n \"wiper\",\n \"wiper-wash\",\n \"wiper-wash-alert\",\n \"wizard-hat\",\n \"wordpress\",\n \"wrap\",\n \"wrap-disabled\",\n \"wrench\",\n \"wrench-check\",\n \"wrench-check-outline\",\n \"wrench-clock\",\n \"wrench-clock-outline\",\n \"wrench-cog\",\n \"wrench-cog-outline\",\n \"wrench-outline\",\n \"xamarin\",\n \"xml\",\n \"xmpp\",\n \"yahoo\",\n \"yeast\",\n \"yin-yang\",\n \"yoga\",\n \"youtube\",\n \"youtube-gaming\",\n \"youtube-studio\",\n \"youtube-subscription\",\n \"youtube-tv\",\n \"yurt\",\n \"z-wave\",\n \"zend\",\n \"zigbee\",\n \"zip-box\",\n \"zip-box-outline\",\n \"zip-disk\",\n \"zodiac-aquarius\",\n \"zodiac-aries\",\n \"zodiac-cancer\",\n \"zodiac-capricorn\",\n \"zodiac-gemini\",\n \"zodiac-leo\",\n \"zodiac-libra\",\n \"zodiac-pisces\",\n \"zodiac-sagittarius\",\n \"zodiac-scorpio\",\n \"zodiac-taurus\",\n \"zodiac-virgo\"\n ]\n}","/**\n * Get Types Tool\n *\n * Returns TypeScript type definitions for Idealyst components, theme, and navigation.\n * Enhanced with @idealyst/tooling registry data for authoritative prop values.\n *\n * Types are generated dynamically at runtime using @idealyst/tooling if the\n * pre-generated types.json file is not found.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { analyzeComponents, analyzeTheme } from '@idealyst/tooling';\nimport type { ComponentRegistry, ThemeValues } from '@idealyst/tooling';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ninterface TypesData {\n version: string;\n extractedAt: string;\n components: Record<string, any>;\n theme: Record<string, any>;\n navigation: Record<string, any>;\n // Registry data from @idealyst/tooling (single source of truth)\n registry?: {\n components: Record<string, any>;\n themeValues: any;\n };\n}\n\nlet cachedTypes: TypesData | null = null;\n\n/**\n * Find the monorepo root by looking for package.json with workspaces\n */\nfunction findMonorepoRoot(): string | null {\n // Start from the mcp-server package location\n let currentDir = path.resolve(__dirname, '../..');\n\n // Walk up looking for the monorepo root (has workspaces in package.json)\n for (let i = 0; i < 10; i++) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.workspaces) {\n return currentDir;\n }\n } catch {\n // Continue searching\n }\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Find package paths - works with both symlinked monorepo and installed packages\n */\nfunction findPackagePaths(): { componentsPath: string; themePath: string } | null {\n // First try: resolve via node_modules (works for symlinked monorepo)\n try {\n const componentsEntry = require.resolve('@idealyst/components');\n const themeEntry = require.resolve('@idealyst/theme');\n\n // Get the src directories\n const componentsPath = path.join(path.dirname(componentsEntry), '..', 'src');\n const themePath = path.join(path.dirname(themeEntry), '..', 'src', 'lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n } catch {\n // Not found via require.resolve\n }\n\n // Second try: look for monorepo structure\n const monorepoRoot = findMonorepoRoot();\n if (monorepoRoot) {\n const componentsPath = path.join(monorepoRoot, 'packages/components/src');\n const themePath = path.join(monorepoRoot, 'packages/theme/src/lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n }\n\n return null;\n}\n\n/**\n * Static navigation types - hardcoded since dynamic extraction requires ts-morph.\n * These map to the actual exports from @idealyst/navigation.\n */\nfunction getStaticNavigationTypes(): Record<string, string> {\n return {\n NavigatorProvider: `// NavigatorProvider — Root navigation component\nimport type { NavigatorParam } from '@idealyst/navigation';\n\ntype NavigatorProviderProps = {\n route: NavigatorParam;\n floatingComponent?: React.ReactNode;\n};\n\n// Usage: <NavigatorProvider route={routeConfig} />`,\n\n NavigateParams: `// NavigateParams — Used with navigate() and replace()\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean;\n state?: Record<string, string | number | boolean>;\n};`,\n\n useNavigator: `// useNavigator() — Navigation hook\n// Returns: { navigate, replace, canGoBack, goBack }\ntype NavigatorContextValue = {\n navigate: (params: NavigateParams) => void;\n replace: (params: Omit<NavigateParams, 'replace'>) => void;\n canGoBack: () => boolean;\n goBack: () => void;\n};\n\n// Usage:\n// const { navigate, goBack, canGoBack } = useNavigator();\n// navigate({ path: '/detail', vars: { id: '123' } });\n// navigate({ path: '/home', state: { tab: 'recent' } });`,\n\n useParams: `// useParams() — Get route parameters\n// Returns Record<string, string | undefined>\n// NOTE: Does NOT accept type parameters. Use type assertion if needed.\n// const params = useParams();\n// const id = params.id; // string | undefined`,\n\n useNavigationState: `// useNavigationState<T>() — Get navigation state data\n// Returns T (defaults to Record<string, unknown>)\n// Always provide a type parameter:\n// const state = useNavigationState<{ autostart?: boolean }>();`,\n\n useCurrentPath: `// useCurrentPath() — Get current route path as string\n// const path = useCurrentPath(); // '/users/123'`,\n\n RouteConfig: `// Route Configuration Types\ntype ScreenParam = {\n path: string;\n type: 'screen';\n component: React.ComponentType;\n options?: ScreenOptions;\n};\n\ntype ScreenOptions = {\n title?: string;\n headerShown?: boolean;\n fullScreen?: boolean;\n headerTitle?: React.ComponentType | React.ReactElement | string;\n headerLeft?: React.ComponentType | React.ReactElement;\n headerRight?: React.ComponentType | React.ReactElement;\n headerBackVisible?: boolean;\n};\n\ntype TabBarScreenOptions = ScreenOptions & {\n tabBarIcon?: (props: { focused: boolean; color: string; size: string | number }) => React.ReactElement;\n tabBarLabel?: string;\n tabBarBadge?: string | number;\n tabBarVisible?: boolean;\n};\n\ntype TabNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'tab';\n routes: RouteParam[];\n options?: TabBarScreenOptions;\n};\n\ntype StackNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'stack';\n routes: RouteParam[];\n options?: ScreenOptions;\n};\n\ntype DrawerNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'drawer';\n routes: RouteParam[];\n options?: TabBarScreenOptions;\n sidebarComponent?: React.ComponentType;\n};\n\ntype NavigatorParam = TabNavigatorParam | StackNavigatorParam | DrawerNavigatorParam;\ntype RouteParam = NavigatorParam | ScreenParam;`,\n };\n}\n\n/**\n * Generate types dynamically using @idealyst/tooling\n */\nfunction generateTypes(): TypesData {\n const paths = findPackagePaths();\n\n if (!paths) {\n throw new Error(\n 'Could not find @idealyst/components and @idealyst/theme packages. ' +\n 'Ensure you are running in the Idealyst monorepo or have the packages installed.'\n );\n }\n\n const { componentsPath, themePath } = paths;\n\n // Analyze components using @idealyst/tooling\n let componentRegistry: ComponentRegistry = {};\n let themeValues: ThemeValues | null = null;\n\n try {\n componentRegistry = analyzeComponents({\n componentPaths: [componentsPath],\n themePath,\n });\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze components:', error);\n }\n\n try {\n themeValues = analyzeTheme(themePath, false);\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze theme:', error);\n }\n\n // Convert component registry to the expected format\n const components: Record<string, any> = {};\n for (const [name, def] of Object.entries(componentRegistry)) {\n components[name] = {\n propsInterface: `${name}Props`,\n props: Object.entries(def.props).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n description: prop.description,\n values: prop.values,\n default: prop.default,\n })),\n typeDefinition: '', // Not available without ts-morph\n relatedTypes: {},\n registry: def,\n };\n }\n\n // Build theme types from themeValues\n const theme: Record<string, any> = {};\n if (themeValues) {\n theme.Intent = {\n name: 'Intent',\n definition: `type Intent = ${themeValues.intents.map((i) => `'${i}'`).join(' | ')};`,\n values: themeValues.intents,\n };\n\n // Extract size keys from the first size group\n // themeValues.sizes is Record<string, string[]> — the values are string arrays, not objects\n const firstSizeGroup = Object.keys(themeValues.sizes)[0];\n const sizeKeys = firstSizeGroup\n ? (themeValues.sizes as Record<string, string[]>)[firstSizeGroup]\n : ['xs', 'sm', 'md', 'lg', 'xl'];\n theme.Size = {\n name: 'Size',\n definition: `type Size = ${sizeKeys.map((s) => `'${s}'`).join(' | ')};`,\n values: sizeKeys,\n };\n }\n\n return {\n version: 'dynamic',\n extractedAt: new Date().toISOString(),\n components,\n theme,\n navigation: getStaticNavigationTypes(),\n registry: {\n components: componentRegistry,\n themeValues,\n },\n };\n}\n\n/**\n * Load types from JSON file or generate dynamically\n */\nfunction loadTypes(): TypesData {\n if (cachedTypes) {\n return cachedTypes;\n }\n\n // Try to load pre-generated types first (works for both bundled and source)\n const pkgRoot = findPackageRoot();\n const typesPath = path.join(pkgRoot, 'src/generated/types.json');\n\n if (fs.existsSync(typesPath)) {\n try {\n const content = fs.readFileSync(typesPath, 'utf-8');\n cachedTypes = JSON.parse(content);\n return cachedTypes!;\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not parse types.json, generating dynamically');\n }\n }\n\n // Generate types dynamically\n cachedTypes = generateTypes();\n return cachedTypes;\n}\n\n/**\n * Find the canonical component name from types data (case-insensitive)\n */\n/** Deprecated component names that should redirect to their replacements */\nconst deprecatedAliases: Record<string, string> = {\n Input: \"TextInput\",\n};\n\nfunction findComponentNameInTypes(types: TypesData, componentName: string): string | undefined {\n // Direct match first (fast path)\n if (types.components[componentName]) {\n // Redirect deprecated components to their replacements\n return deprecatedAliases[componentName] ?? componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n const match = Object.keys(types.components).find(\n (name) => name.toLowerCase() === lowerName\n );\n\n if (match) {\n // Redirect deprecated components to their replacements\n return deprecatedAliases[match] ?? match;\n }\n\n return undefined;\n}\n\n/**\n * Get component types by name (case-insensitive)\n */\nexport function getComponentTypes(componentName: string, format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n const canonicalName = findComponentNameInTypes(types, componentName);\n\n if (!canonicalName) {\n throw new Error(\n `Component \"${componentName}\" not found. Available components: ${Object.keys(types.components).join(', ')}`\n );\n }\n\n const component = types.components[canonicalName];\n\n const result: any = {\n component: canonicalName,\n };\n\n if (format === 'typescript' || format === 'both') {\n result.typescript = formatTypeScriptOutput(component);\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = {\n propsInterface: component.propsInterface,\n props: component.props,\n relatedTypes: component.relatedTypes,\n };\n\n // Include registry data if available (authoritative prop values)\n if (component.registry) {\n result.registry = component.registry;\n }\n }\n\n return result;\n}\n\n/**\n * Get theme types\n */\nexport function getThemeTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Theme Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.theme)\n .map(([_, info]: [string, any]) => info.definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.theme;\n\n // Include authoritative theme values from registry if available\n if (types.registry?.themeValues) {\n result.themeValues = types.registry.themeValues;\n }\n }\n\n return result;\n}\n\n/**\n * Get navigation types\n */\nexport function getNavigationTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Navigation Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.navigation)\n .map(([_, definition]) => definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.navigation;\n }\n\n return result;\n}\n\n/**\n * Known type resolutions for props that the @idealyst/tooling analyzer reports as `any`.\n * The analyzer cannot resolve types imported from @idealyst/theme, so we map them here.\n * Key format: \"ComponentName.propName\" or just \"propName\" for global matches.\n */\nconst KNOWN_PROP_TYPES: Record<string, string> = {\n // Icon-specific\n 'Icon.size': \"'xs' | 'sm' | 'md' | 'lg' | 'xl' | number\",\n 'Icon.intent': \"'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\",\n 'Icon.color': \"Color /* e.g. 'blue.500', 'red.300' — use intent for semantic coloring */\",\n 'Icon.textColor': \"'primary' | 'secondary' | 'tertiary' | 'inverse'\",\n // Global fallbacks for common prop names when type is 'any'\n 'size': \"'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n 'intent': \"'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\",\n};\n\n/**\n * Resolve a prop's type, replacing 'any' with known concrete types where possible.\n */\nfunction resolveAnyType(componentName: string, propName: string, rawType: string): string {\n if (rawType !== 'any') return rawType;\n return KNOWN_PROP_TYPES[`${componentName}.${propName}`]\n ?? KNOWN_PROP_TYPES[propName]\n ?? rawType;\n}\n\n/**\n * Synthesize a TypeScript interface string from a component's properties array.\n * Used as a fallback when typeDefinition is not available (e.g. dynamic generation\n * without ts-morph).\n */\nfunction synthesizeTypeDefinition(component: any): string {\n const interfaceName = component.propsInterface || 'Props';\n const componentName = interfaceName.replace(/Props$/, '');\n const props: any[] = component.props || [];\n\n if (props.length === 0) {\n return `interface ${interfaceName} {}`;\n }\n\n const lines: string[] = [];\n lines.push(`interface ${interfaceName} {`);\n\n for (const prop of props) {\n // Add JSDoc comment with description and default value\n const docParts: string[] = [];\n if (prop.description) {\n docParts.push(prop.description);\n }\n if (prop.defaultValue !== undefined && prop.defaultValue !== null) {\n docParts.push(`@default ${prop.defaultValue}`);\n } else if (prop.default !== undefined && prop.default !== null) {\n docParts.push(`@default ${prop.default}`);\n }\n\n if (docParts.length > 0) {\n if (docParts.length === 1) {\n lines.push(` /** ${docParts[0]} */`);\n } else {\n lines.push(' /**');\n for (const part of docParts) {\n lines.push(` * ${part}`);\n }\n lines.push(' */');\n }\n }\n\n const optional = prop.required ? '' : '?';\n const propType = resolveAnyType(componentName, prop.name, prop.type || 'unknown');\n lines.push(` ${prop.name}${optional}: ${propType};`);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/**\n * Format TypeScript output for better readability\n */\nfunction formatTypeScriptOutput(component: any): string {\n const sections: string[] = [];\n\n // Main props interface\n sections.push(`// ${component.propsInterface}`);\n\n if (component.typeDefinition) {\n sections.push(component.typeDefinition);\n } else {\n // typeDefinition is empty — synthesize from properties data\n sections.push(synthesizeTypeDefinition(component));\n }\n\n // Related types\n if (Object.keys(component.relatedTypes).length > 0) {\n sections.push('\\n// Related Types');\n for (const [_, definition] of Object.entries(component.relatedTypes)) {\n sections.push(definition as string);\n }\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get list of all available components\n */\nexport function getAvailableComponents() {\n const types = loadTypes();\n return Object.keys(types.components);\n}\n\n/**\n * Find the mcp-server package root directory.\n * After bundling, __dirname points to dist/ (one level deep), but the source\n * code assumes dist/tools/ (two levels deep). This helper finds the package\n * root reliably regardless of bundling by walking up from __dirname.\n */\nfunction findPackageRoot(): string {\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.name === '@idealyst/mcp-server') {\n return dir;\n }\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback: assume __dirname is dist/ or src/tools/\n return path.resolve(__dirname, '../..');\n}\n\n/**\n * Find the correct example file name (case-insensitive)\n */\nfunction findExampleFile(componentName: string): string | null {\n const examplesDir = path.join(findPackageRoot(), 'examples/components');\n\n // Direct match first (fast path)\n const directPath = path.join(examplesDir, `${componentName}.examples.tsx`);\n if (fs.existsSync(directPath)) {\n return directPath;\n }\n\n // Case-insensitive lookup\n if (!fs.existsSync(examplesDir)) {\n return null;\n }\n\n const lowerName = componentName.toLowerCase();\n const files = fs.readdirSync(examplesDir);\n const match = files.find(\n (file) => file.toLowerCase() === `${lowerName}.examples.tsx`\n );\n\n return match ? path.join(examplesDir, match) : null;\n}\n\n/**\n * Get examples for a component (case-insensitive)\n */\nexport function getComponentExamples(componentName: string): string | null {\n const examplesPath = findExampleFile(componentName);\n\n if (!examplesPath) {\n return null;\n }\n\n return fs.readFileSync(examplesPath, 'utf-8');\n}\n\n/**\n * Get the full component registry from @idealyst/tooling\n * This is the single source of truth for component props and values\n */\nexport function getComponentRegistry() {\n const types = loadTypes();\n return types.registry?.components || {};\n}\n\n/**\n * Get theme values from the registry\n * This is the single source of truth for available intents, sizes, etc.\n */\nexport function getRegistryThemeValues() {\n const types = loadTypes();\n return types.registry?.themeValues || null;\n}\n","/**\n * Tool Handlers\n *\n * Implementation functions for all MCP tools.\n * These handlers can be used directly or through an MCP server.\n *\n * Component documentation now uses:\n * - Types: Dynamically loaded from @idealyst/tooling via generated/types.json\n * - Examples: Type-checked .examples.tsx files in examples/components/\n * - Metadata: Minimal static metadata (category, description, features, best practices)\n */\n\nimport {\n componentMetadata,\n getComponentMetadata,\n getComponentNames,\n searchComponents as searchComponentsData,\n getComponentsByCategory,\n findComponentName,\n} from \"../data/component-metadata.js\";\nimport { cliCommands } from \"../data/cli-commands.js\";\nimport { translateGuides } from \"../data/translate-guides.js\";\nimport { storageGuides } from \"../data/storage-guides.js\";\nimport { audioGuides } from \"../data/audio-guides.js\";\nimport { cameraGuides } from \"../data/camera-guides.js\";\nimport { filesGuides } from \"../data/files-guides.js\";\nimport { oauthClientGuides } from \"../data/oauth-client-guides.js\";\nimport { animateGuides } from \"../data/animate-guides.js\";\nimport { datagridGuides } from \"../data/datagrid-guides.js\";\nimport { datepickerGuides } from \"../data/datepicker-guides.js\";\nimport { lottieGuides } from \"../data/lottie-guides.js\";\nimport { markdownGuides } from \"../data/markdown-guides.js\";\nimport { configGuides } from \"../data/config-guides.js\";\nimport { chartsGuides } from \"../data/charts-guides.js\";\nimport {\n packages,\n getPackageSummary,\n getPackagesByCategory as getPackagesByCat,\n searchPackages as searchPackagesData,\n} from \"../data/packages.js\";\nimport {\n recipes,\n getRecipeSummary,\n getRecipesByCategory,\n searchRecipes as searchRecipesData,\n} from \"../data/recipes/index.js\";\nimport {\n installGuides,\n getInstallGuide as getInstallGuideData,\n formatInstallGuideMarkdown,\n} from \"../data/install-guides.js\";\nimport { idealystIntro } from \"../data/intro.js\";\nimport iconsData from \"../data/icons.json\" with { type: \"json\" };\nimport {\n getComponentTypes as getTypesFromFile,\n getThemeTypes as getThemeTypesFromFile,\n getNavigationTypes as getNavigationTypesFromFile,\n getAvailableComponents,\n getComponentExamples as getComponentExamplesFromFile,\n} from \"./get-types.js\";\nimport type {\n ToolResponse,\n ListComponentsArgs,\n GetComponentDocsArgs,\n GetComponentExampleArgs,\n SearchComponentsArgs,\n GetComponentTypesArgs,\n GetComponentExamplesTsArgs,\n GetCliUsageArgs,\n SearchIconsArgs,\n GetThemeTypesArgs,\n GetNavigationTypesArgs,\n GetTranslateGuideArgs,\n GetStorageGuideArgs,\n GetAudioGuideArgs,\n GetCameraGuideArgs,\n GetFilesGuideArgs,\n GetOauthClientGuideArgs,\n GetAnimateGuideArgs,\n GetDatagridGuideArgs,\n GetDatepickerGuideArgs,\n GetLottieGuideArgs,\n GetMarkdownGuideArgs,\n GetConfigGuideArgs,\n GetChartsGuideArgs,\n ListPackagesArgs,\n GetPackageDocsArgs,\n SearchPackagesArgs,\n ListRecipesArgs,\n GetRecipeArgs,\n SearchRecipesArgs,\n GetInstallGuideArgs,\n GetIntroArgs,\n} from \"./types.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a standard tool response with text content\n */\nfunction textResponse(text: string): ToolResponse {\n return {\n content: [{ type: \"text\", text }],\n };\n}\n\n/**\n * Create a JSON response\n */\nfunction jsonResponse(data: unknown): ToolResponse {\n return textResponse(JSON.stringify(data, null, 2));\n}\n\n// ============================================================================\n// Component Tool Handlers\n// ============================================================================\n\n/**\n * List all available Idealyst components with brief descriptions\n */\nexport function listComponents(_args: ListComponentsArgs = {}): ToolResponse {\n const componentList = getComponentNames().map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(componentList);\n}\n\n/**\n * Get detailed documentation for a specific component\n *\n * Returns:\n * - Description and category from metadata\n * - TypeScript props from dynamic types\n * - Features and best practices from metadata\n * - Type-checked examples from .examples.tsx files\n */\nexport function getComponentDocs(args: GetComponentDocsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(\n `Component \"${inputName}\" not found. Available components: ${getComponentNames().join(\", \")}`\n );\n }\n\n const meta = getComponentMetadata(canonicalName)!;\n\n // Get TypeScript types for props documentation\n let propsSection = \"\";\n try {\n const types = getTypesFromFile(canonicalName, \"typescript\");\n propsSection = `## Props (TypeScript)\n\n\\`\\`\\`typescript\n${types.typescript}\n\\`\\`\\``;\n } catch {\n propsSection = \"## Props\\n\\n_Types not available. Run `yarn extract-types` to generate._\";\n }\n\n // Get type-checked examples\n let examplesSection = \"\";\n const examples = getComponentExamplesFromFile(canonicalName);\n if (examples) {\n examplesSection = `## Examples\n\n\\`\\`\\`tsx\n${examples}\n\\`\\`\\``;\n }\n\n // Add component-specific warnings\n let warningSection = \"\";\n if (canonicalName === \"Card\") {\n warningSection = `\n## WARNING: No Compound Components\n\nCard is a **simple container** component. There are NO sub-components like \\`Card.Content\\`, \\`Card.Header\\`, \\`Card.Body\\`, \\`Card.Footer\\`, or \\`Card.Title\\`. Using these will cause TS2339 errors.\n\n**Correct usage:** Put children directly inside \\`<Card>...</Card>\\`:\n\\`\\`\\`tsx\n<Card padding=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Title</Text>\n <Text typography=\"body2\">Body content</Text>\n <Button onPress={handler}>Action</Button>\n</Card>\n\\`\\`\\`\n`;\n }\n\n const docs = `# ${canonicalName}\n\n${meta.description}\n${warningSection}\n## Category\n${meta.category}\n\n${propsSection}\n\n## Features\n${meta.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n## Best Practices\n${meta.bestPractices.map((bp) => `- ${bp}`).join(\"\\n\")}\n\n${examplesSection}\n`;\n\n return textResponse(docs);\n}\n\n/**\n * Get a code example for a specific component\n *\n * Returns the type-checked example file content.\n * The example_type parameter is kept for API compatibility but all examples\n * are now in a single .examples.tsx file.\n */\nexport function getComponentExample(args: GetComponentExampleArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(`Component \"${inputName}\" not found.`);\n }\n\n const examples = getComponentExamplesFromFile(canonicalName);\n if (!examples) {\n return textResponse(\n `No examples found for \"${canonicalName}\". Examples are in packages/mcp-server/examples/components/${canonicalName}.examples.tsx`\n );\n }\n\n return textResponse(examples);\n}\n\n/**\n * Search for components by name, category, or feature\n */\nexport function searchComponents(args: SearchComponentsArgs = {}): ToolResponse {\n const query = args.query || \"\";\n const category = args.category;\n\n let results: string[];\n\n if (query) {\n results = searchComponentsData(query, category);\n } else if (category) {\n results = getComponentsByCategory(category);\n } else {\n results = getComponentNames();\n }\n\n const resultList = results.map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(resultList);\n}\n\n/**\n * Get TypeScript type definitions for a component\n */\nexport function getComponentTypes(args: GetComponentTypesArgs): ToolResponse {\n const componentInput = args.component;\n const format = args.format || \"both\";\n\n // Support comma-separated batch lookups: \"Button,Card,Text\"\n const names = componentInput.split(\",\").map(s => s.trim()).filter(Boolean);\n\n if (names.length > 1) {\n // Batch mode: return all requested component types in one response\n const batchResult: Record<string, unknown> = {};\n const errors: string[] = [];\n\n for (const name of names) {\n try {\n const result = getTypesFromFile(name, format);\n const processed = postProcessComponentTypes(name, result);\n batchResult[name] = processed;\n } catch (error) {\n errors.push(`${name}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n if (errors.length > 0) {\n (batchResult as any)._errors = errors;\n }\n\n return jsonResponse(batchResult);\n }\n\n // Single component mode (original behavior)\n const componentName = names[0] || componentInput;\n\n try {\n const result = getTypesFromFile(componentName, format);\n const processed = postProcessComponentTypes(componentName, result);\n return jsonResponse(processed);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Post-process component types to add guidance notes and truncate large payloads\n */\nfunction postProcessComponentTypes(componentName: string, result: unknown): unknown {\n // Truncate Icon's massive IconName values list (7,447 entries → ~10 examples + note)\n if (componentName.toLowerCase() === 'icon' && typeof result === 'object' && result !== null) {\n const r = result as any;\n if (r.registry?.props?.name?.values && Array.isArray(r.registry.props.name.values)) {\n const total = r.registry.props.name.values.length;\n r.registry.props.name.values = [\n ...r.registry.props.name.values.slice(0, 10),\n `... and ${total - 10} more. Use search_icons to find specific icon names.`,\n ];\n }\n if (r.schema?.props && Array.isArray(r.schema.props)) {\n for (const prop of r.schema.props) {\n if (prop.name === 'name' && Array.isArray(prop.values) && prop.values.length > 20) {\n const total = prop.values.length;\n prop.values = [\n ...prop.values.slice(0, 10),\n `... and ${total - 10} more. Use search_icons to find specific icon names.`,\n ];\n }\n }\n }\n }\n\n // Add Card-specific guidance to prevent compound component hallucination\n if (componentName.toLowerCase() === 'card') {\n if (typeof result === 'object' && result !== null) {\n (result as any).usageNote = \"Card is a SIMPLE CONTAINER — there are NO compound components. \" +\n \"Do NOT use Card.Content, Card.Header, Card.Body, Card.Footer, Card.Title — they do NOT exist and will cause TS2339. \" +\n \"Just put children directly inside <Card>...</Card>. Example: <Card padding=\\\"md\\\"><Text>Title</Text><Text>Body</Text></Card>\";\n }\n }\n\n // Add IconName guidance for components that use icon props\n const resultStr = JSON.stringify(result);\n if (resultStr.includes('IconName') || resultStr.includes('mdi:')) {\n const iconNote = \"\\n\\nICON NAME FORMAT: The `name` prop type shows `IconName | \\\"mdi:...\\\"` variants. \" +\n \"Both formats work in JSX props. However, when you store icon names in variables, type them as `IconName` \" +\n \"and use BARE names (without 'mdi:' prefix):\\n\" +\n \"```tsx\\n\" +\n \"import type { IconName } from '@idealyst/components';\\n\" +\n \"const icon: IconName = 'home'; // CORRECT\\n\" +\n \"const icon: IconName = 'mdi:home'; // WRONG — TS error\\n\" +\n \"const icon: string = 'home'; // WRONG — won't match IconName props\\n\" +\n \"```\\n\" +\n \"Always use bare names like 'home', 'check-circle', 'arrow-left' — never 'mdi:home'.\";\n\n if (typeof result === 'object' && result !== null) {\n (result as any).iconNameNote = iconNote;\n }\n }\n\n return result;\n}\n\n/**\n * Get validated TypeScript examples for a component\n *\n * These examples are type-checked against the actual component props\n * to ensure they compile and are correct.\n */\nexport function getComponentExamplesTs(args: GetComponentExamplesTsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n try {\n // If component name is not recognized in metadata, still try to find examples\n const lookupName = canonicalName || inputName;\n const examples = getComponentExamplesFromFile(lookupName);\n if (!examples) {\n const availableComponents = getAvailableComponents();\n return textResponse(\n `No TypeScript examples found for component \"${inputName}\". Available components with examples: ${availableComponents.join(\", \")}`\n );\n }\n\n return textResponse(examples);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// CLI Tool Handlers\n// ============================================================================\n\n/**\n * Get information about CLI commands and usage\n */\nexport function getCliUsage(args: GetCliUsageArgs = {}): ToolResponse {\n const commandName = args.command;\n\n if (commandName) {\n const command = cliCommands[commandName];\n if (!command) {\n return textResponse(\n `Command \"${commandName}\" not found. Available commands: ${Object.keys(cliCommands).join(\", \")}`\n );\n }\n\n return textResponse(`# ${commandName}\n\n${command.description}\n\n## Usage\n\\`\\`\\`bash\n${command.usage}\n\\`\\`\\`\n\n## Options\n${command.options.map((opt: any) => `- \\`${opt.flag}\\`: ${opt.description}`).join(\"\\n\")}\n\n## Examples\n${command.examples.map((ex: string) => `\\`\\`\\`bash\\n${ex}\\n\\`\\`\\``).join(\"\\n\\n\")}\n`);\n }\n\n // Return all commands\n const allCommands = Object.entries(cliCommands).map(([name, data]) => ({\n name,\n description: data.description,\n usage: data.usage,\n }));\n\n return jsonResponse(allCommands);\n}\n\n// ============================================================================\n// Icon Tool Handlers\n// ============================================================================\n\n/**\n * Search for Material Design Icons\n */\n/**\n * Icon search term aliases — maps common search terms to their MDI equivalents.\n * Agents often search for generic terms; this maps them to actual icon names.\n */\nconst iconSearchAliases: Record<string, string[]> = {\n back: ['arrow-left', 'chevron-left'],\n forward: ['arrow-right', 'chevron-right'],\n next: ['arrow-right', 'chevron-right', 'skip-next'],\n previous: ['arrow-left', 'chevron-left', 'skip-previous'],\n user: ['account'],\n profile: ['account', 'account-circle'],\n search: ['magnify'],\n settings: ['cog'],\n password: ['lock', 'key'],\n mail: ['email'],\n notification: ['bell'],\n notifications: ['bell'],\n spinner: ['loading'],\n send: ['send'],\n save: ['content-save'],\n edit: ['pencil'],\n copy: ['content-copy'],\n paste: ['content-paste'],\n trash: ['delete'],\n remove: ['delete', 'close'],\n add: ['plus'],\n create: ['plus'],\n photo: ['camera', 'image'],\n picture: ['image'],\n like: ['heart', 'thumb-up'],\n favorite: ['heart', 'star'],\n error: ['alert-circle', 'close-circle'],\n warning: ['alert'],\n success: ['check-circle'],\n info: ['information'],\n expand: ['chevron-down'],\n collapse: ['chevron-up'],\n more: ['dots-vertical', 'dots-horizontal'],\n options: ['dots-vertical'],\n refresh: ['refresh'],\n reload: ['refresh'],\n dark: ['weather-night'],\n light: ['weather-sunny', 'white-balance-sunny'],\n theme: ['theme-light-dark', 'palette'],\n phone: ['phone', 'cellphone'],\n call: ['phone', 'phone-outline'],\n check: ['check', 'check-circle', 'check-bold'],\n tick: ['check', 'check-circle'],\n close: ['close', 'close-circle'],\n dismiss: ['close', 'close-circle'],\n x: ['close'],\n lock: ['lock', 'lock-outline'],\n security: ['lock', 'shield'],\n eye: ['eye', 'eye-off', 'eye-outline'],\n visibility: ['eye', 'eye-off'],\n sort: ['sort', 'sort-ascending', 'sort-descending'],\n filter: ['filter', 'filter-outline'],\n calendar: ['calendar', 'calendar-month'],\n date: ['calendar', 'calendar-month'],\n location: ['map-marker', 'map-marker-outline'],\n pin: ['map-marker', 'pin'],\n share: ['share', 'share-variant'],\n download: ['download', 'cloud-download'],\n upload: ['upload', 'cloud-upload'],\n play: ['play', 'play-circle'],\n pause: ['pause', 'pause-circle'],\n stop: ['stop', 'stop-circle'],\n record: ['record', 'microphone'],\n microphone: ['microphone', 'microphone-outline'],\n mic: ['microphone', 'microphone-outline'],\n menu: ['menu', 'hamburger'],\n list: ['format-list-bulleted', 'view-list'],\n grid: ['view-grid', 'grid'],\n time: ['clock', 'clock-outline'],\n clock: ['clock', 'clock-outline'],\n link: ['link', 'link-variant'],\n attach: ['paperclip', 'attachment'],\n logout: ['logout', 'exit-to-app'],\n login: ['login', 'account-arrow-right'],\n flash: ['flash', 'flash-off', 'flash-auto'],\n home: ['home', 'home-outline', 'home-variant'],\n house: ['home', 'home-outline', 'home-variant'],\n money: ['currency-usd', 'cash', 'cash-multiple', 'wallet'],\n currency: ['currency-usd', 'currency-eur', 'currency-gbp'],\n dollar: ['currency-usd'],\n trending: ['trending-up', 'trending-down', 'chart-line'],\n chart: ['chart-line', 'chart-bar', 'chart-pie', 'chart-donut'],\n graph: ['chart-line', 'chart-bar', 'chart-areaspline'],\n gallery: ['image-multiple', 'view-gallery'],\n image: ['image', 'image-outline', 'image-multiple'],\n cart: ['cart', 'cart-outline', 'cart-plus', 'cart-check'],\n shopping: ['cart', 'shopping', 'basket'],\n wifi: ['wifi', 'wifi-off'],\n bluetooth: ['bluetooth', 'bluetooth-off'],\n volume: ['volume-high', 'volume-medium', 'volume-low', 'volume-off'],\n sound: ['volume-high', 'volume-off', 'music'],\n music: ['music', 'music-note'],\n video: ['video', 'video-outline', 'video-off'],\n file: ['file', 'file-outline', 'file-document'],\n folder: ['folder', 'folder-outline', 'folder-open'],\n document: ['file-document', 'file-document-outline'],\n print: ['printer', 'printer-outline'],\n help: ['help-circle', 'help-circle-outline'],\n question: ['help-circle', 'help-circle-outline'],\n swap: ['swap-horizontal', 'swap-vertical'],\n sync: ['sync', 'cloud-sync'],\n crop: ['crop', 'crop-free'],\n rotate: ['rotate-left', 'rotate-right', 'screen-rotation'],\n fullscreen: ['fullscreen', 'fullscreen-exit'],\n minus: ['minus', 'minus-circle'],\n plus: ['plus', 'plus-circle'],\n brightness: ['brightness-5', 'brightness-6', 'brightness-7'],\n language: ['translate', 'web'],\n globe: ['earth', 'web'],\n world: ['earth', 'web'],\n};\n\nexport function searchIcons(args: SearchIconsArgs): ToolResponse {\n const query = args.query?.toLowerCase() || \"\";\n const limit = args.limit || 40;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n // Resolve aliases: if the query is a known alias, include those icons directly\n const aliasMatches: string[] = [];\n const queryWords = query.split(/\\s+/).filter(Boolean);\n for (const word of queryWords) {\n const aliases = iconSearchAliases[word];\n if (aliases) {\n for (const alias of aliases) {\n // Find all icons that match the alias using boundary matching\n for (const icon of iconsData.icons) {\n const lower = (icon as string).toLowerCase();\n if (lower === alias || lower.startsWith(alias + '-')) {\n if (!aliasMatches.includes(icon as string)) {\n aliasMatches.push(icon as string);\n }\n }\n }\n }\n }\n }\n\n // Filter icons that match the query\n // Use word-boundary matching: split icon names on hyphens, match query words against segments.\n // This prevents \"lock\" from matching \"clock\", \"ash\" from matching \"flash\", etc.\n const hyphenatedQuery = queryWords.join(\"-\");\n\n // Helper: check if an icon matches a single word on segment boundaries\n const matchesWord = (segments: string[], word: string) =>\n segments.some((seg) => seg === word || seg.startsWith(word));\n\n // Helper: check if an icon matches the full hyphenated query on boundaries\n const matchesHyphenated = (lower: string) => {\n if (!lower.includes(hyphenatedQuery)) return false;\n const idx = lower.indexOf(hyphenatedQuery);\n const before = idx === 0 || lower[idx - 1] === \"-\";\n const after =\n idx + hyphenatedQuery.length === lower.length ||\n lower[idx + hyphenatedQuery.length] === \"-\";\n return before && after;\n };\n\n // First pass: AND match (all words must match)\n const andMatches: string[] = [];\n // Second pass: OR match (any word matches) — used as fallback for multi-word queries\n const orOnlyMatches: string[] = [];\n\n for (const icon of iconsData.icons) {\n const lower = (icon as string).toLowerCase();\n const segments = lower.split(\"-\");\n\n if (matchesHyphenated(lower)) {\n andMatches.push(icon as string);\n } else if (queryWords.every((word) => matchesWord(segments, word))) {\n andMatches.push(icon as string);\n } else if (queryWords.length > 1 && queryWords.some((word) => matchesWord(segments, word))) {\n orOnlyMatches.push(icon as string);\n }\n }\n\n // Combine: alias matches first, then AND matches, then OR matches (deduplicated)\n const seen = new Set<string>();\n const matchingIcons: string[] = [];\n for (const list of [aliasMatches, andMatches, orOnlyMatches]) {\n for (const icon of list) {\n if (!seen.has(icon)) {\n seen.add(icon);\n matchingIcons.push(icon);\n }\n }\n }\n\n // Sort by relevance: alias matches first, then AND matches, then OR matches.\n // Within each tier, shorter names (more specific) first, then alphabetical.\n const aliasMatchSet = new Set(aliasMatches);\n const andMatchSet = new Set(andMatches);\n matchingIcons.sort((a: string, b: string) => {\n // Tier: alias (0) > AND (1) > OR (2)\n const aTier = aliasMatchSet.has(a) ? 0 : andMatchSet.has(a) ? 1 : 2;\n const bTier = aliasMatchSet.has(b) ? 0 : andMatchSet.has(b) ? 1 : 2;\n if (aTier !== bTier) return aTier - bTier;\n\n // Icons that START with the query get highest priority\n const aStarts = a.startsWith(hyphenatedQuery) ? 0 : 1;\n const bStarts = b.startsWith(hyphenatedQuery) ? 0 : 1;\n if (aStarts !== bStarts) return aStarts - bStarts;\n // Then sort by number of segments (fewer = more specific)\n const aSegments = a.split(\"-\").length;\n const bSegments = b.split(\"-\").length;\n if (aSegments !== bSegments) return aSegments - bSegments;\n // Then alphabetical\n return a.localeCompare(b);\n });\n\n // Limit results\n const limitedResults = matchingIcons.slice(0, limit);\n\n const result = {\n query,\n total: iconsData.total,\n matches: matchingIcons.length,\n returned: limitedResults.length,\n icons: limitedResults,\n import: \"import { Icon } from '@idealyst/components'; import type { IconName } from '@idealyst/components';\",\n usage: \"IMPORTANT: These icon names are of type `IconName` from '@idealyst/components'. Use them WITHOUT any 'mdi:' prefix — just use the bare name (e.g., 'home', not 'mdi:home'). When building helper functions that return icon names, always type the return as `IconName` — never as `string`. Example: `const icon: IconName = 'home'; function getIcon(status: string): IconName { return 'check'; }`. Using `string` as the return type or adding an 'mdi:' prefix will cause TypeScript compilation errors.\",\n };\n\n return jsonResponse(result);\n}\n\n// ============================================================================\n// Theme Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for theme types\n */\nexport function getThemeTypes(args: GetThemeTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getThemeTypesFromFile(format);\n // Add useTheme usage note to prevent common destructuring mistake\n if (typeof result === 'object' && result !== null) {\n (result as Record<string, unknown>).useThemeNote =\n \"IMPORTANT: useTheme() returns Theme directly — NOT wrapped in an object. \" +\n \"Correct: `const theme = useTheme();` \" +\n \"WRONG: `const { theme } = useTheme();` (causes TS2339). \" +\n \"Then use inline styles: `style={{ padding: theme.spacing.md, backgroundColor: theme.colors.surface.primary }}`\";\n }\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Navigation Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for navigation types\n */\nexport function getNavigationTypes(args: GetNavigationTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getNavigationTypesFromFile(format);\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get documentation for the translate package\n */\nexport function getTranslateGuide(args: GetTranslateGuideArgs): ToolResponse {\n let topic = args.topic;\n\n // Allow 'api' as alias for 'runtime-api' (consistent with other guide tools)\n if (topic === 'api') {\n topic = 'runtime-api';\n }\n\n const uri = `idealyst://translate/${topic}`;\n const guide = translateGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, runtime-api (or 'api'), babel-plugin, translation-files, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the storage package\n */\nexport function getStorageGuide(args: GetStorageGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://storage/${topic}`;\n const guide = storageGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the audio package\n */\nexport function getAudioGuide(args: GetAudioGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://audio/${topic}`;\n const guide = audioGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the camera package\n */\nexport function getCameraGuide(args: GetCameraGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://camera/${topic}`;\n const guide = cameraGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the files package\n */\nexport function getFilesGuide(args: GetFilesGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://files/${topic}`;\n const guide = filesGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the oauth-client package\n */\nexport function getOauthClientGuide(args: GetOauthClientGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://oauth-client/${topic}`;\n const guide = oauthClientGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the animate package\n */\nexport function getAnimateGuide(args: GetAnimateGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://animate/${topic}`;\n const guide = animateGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the datagrid package\n */\nexport function getDatagridGuide(args: GetDatagridGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://datagrid/${topic}`;\n const guide = datagridGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the datepicker package\n */\nexport function getDatepickerGuide(args: GetDatepickerGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://datepicker/${topic}`;\n const guide = datepickerGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the lottie package\n */\nexport function getLottieGuide(args: GetLottieGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://lottie/${topic}`;\n const guide = lottieGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the markdown package\n */\nexport function getMarkdownGuide(args: GetMarkdownGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://markdown/${topic}`;\n const guide = markdownGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the config package\n */\nexport function getConfigGuide(args: GetConfigGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://config/${topic}`;\n const guide = configGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the charts package\n */\nexport function getChartsGuide(args: GetChartsGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://charts/${topic}`;\n const guide = chartsGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n// ============================================================================\n// Package Tool Handlers\n// ============================================================================\n\n/**\n * List all available packages\n */\nexport function listPackages(args: ListPackagesArgs = {}): ToolResponse {\n const category = args.category;\n\n if (category) {\n // Filter by specific category\n const byCategory = getPackagesByCat();\n const packageList = (byCategory[category] || []).map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n\n return jsonResponse(packageList);\n }\n\n // Return all packages grouped by category\n const allPackages = getPackageSummary();\n const grouped = allPackages.reduce(\n (acc, pkg) => {\n const cat = pkg.category;\n if (!acc[cat]) acc[cat] = [];\n acc[cat].push(pkg);\n return acc;\n },\n {} as Record<string, typeof allPackages>\n );\n\n return jsonResponse(grouped);\n}\n\n/**\n * Get detailed documentation for a package\n */\nexport function getPackageDocs(args: GetPackageDocsArgs): ToolResponse {\n const packageName = args.package;\n const section = args.section;\n\n // Handle both formats: \"camera\" and \"@idealyst/camera\"\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n const pkg = packages[normalizedName];\n\n if (!pkg) {\n const availablePackages = Object.keys(packages).join(\", \");\n return textResponse(\n `Package \"${packageName}\" not found. Available packages: ${availablePackages}`\n );\n }\n\n // Build documentation based on section or return all\n let docs = \"\";\n\n if (!section || section === \"overview\") {\n docs += `# ${pkg.name} (${pkg.npmName})\n\n${pkg.description}\n\n**Category:** ${pkg.category}\n**Platforms:** ${pkg.platforms.join(\", \")}\n**Documentation Status:** ${pkg.documentationStatus}\n\n`;\n }\n\n if (!section || section === \"installation\") {\n docs += `## Installation\n\n\\`\\`\\`bash\n${pkg.installation}\n\\`\\`\\`\n\n`;\n if (pkg.peerDependencies && pkg.peerDependencies.length > 0) {\n docs += `### Peer Dependencies\n${pkg.peerDependencies.map((dep) => `- ${dep}`).join(\"\\n\")}\n\n`;\n }\n }\n\n if (!section || section === \"features\") {\n docs += `## Features\n\n${pkg.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n`;\n }\n\n if (!section || section === \"quickstart\") {\n docs += `## Quick Start\n\n\\`\\`\\`tsx\n${pkg.quickStart}\n\\`\\`\\`\n\n`;\n }\n\n if (!section || section === \"api\") {\n if (pkg.apiHighlights && pkg.apiHighlights.length > 0) {\n docs += `## API Highlights\n\n${pkg.apiHighlights.map((api) => `- \\`${api}\\``).join(\"\\n\")}\n\n`;\n }\n }\n\n if (pkg.relatedPackages && pkg.relatedPackages.length > 0) {\n docs += `## Related Packages\n\n${pkg.relatedPackages.map((rp) => `- @idealyst/${rp}`).join(\"\\n\")}\n`;\n }\n\n return textResponse(docs.trim());\n}\n\n/**\n * Search across all packages\n */\nexport function searchPackages(args: SearchPackagesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchPackagesData(query);\n\n if (results.length === 0) {\n return textResponse(\n `No packages found matching \"${query}\". Try searching for: camera, oauth, storage, translate, datagrid, datepicker, navigation, etc.`\n );\n }\n\n const resultList = results.map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Recipe Tool Handlers\n// ============================================================================\n\n/**\n * List all available recipes\n */\nexport function listRecipes(args: ListRecipesArgs = {}): ToolResponse {\n const category = args.category;\n const difficulty = args.difficulty;\n\n let recipeList = getRecipeSummary();\n\n // Filter by category\n if (category) {\n recipeList = recipeList.filter((r) => r.category === category);\n }\n\n // Filter by difficulty\n if (difficulty) {\n recipeList = recipeList.filter((r) => r.difficulty === difficulty);\n }\n\n // Group by category for readability\n if (!category) {\n const grouped = recipeList.reduce(\n (acc, recipe) => {\n if (!acc[recipe.category]) acc[recipe.category] = [];\n acc[recipe.category].push(recipe);\n return acc;\n },\n {} as Record<string, typeof recipeList>\n );\n\n return jsonResponse(grouped);\n }\n\n return jsonResponse(recipeList);\n}\n\n/**\n * Get a complete code recipe\n */\nexport function getRecipe(args: GetRecipeArgs): ToolResponse {\n const recipeId = args.recipe;\n\n // Normalize the recipe ID (handle both \"login-form\" and \"loginForm\" etc)\n const normalizedId = recipeId.toLowerCase().replace(/\\s+/g, \"-\");\n const recipe = recipes[normalizedId];\n\n if (!recipe) {\n const availableRecipes = Object.keys(recipes).join(\", \");\n return textResponse(\n `Recipe \"${recipeId}\" not found.\\n\\nAvailable recipes: ${availableRecipes}`\n );\n }\n\n // Format the recipe as markdown\n const output = `# ${recipe.name}\n\n${recipe.description}\n\n**Category:** ${recipe.category}\n**Difficulty:** ${recipe.difficulty}\n**Required packages:** ${recipe.packages.join(\", \")}\n\n## Code\n\n\\`\\`\\`tsx\n${recipe.code}\n\\`\\`\\`\n\n## Explanation\n\n${recipe.explanation}\n\n${\n recipe.tips && recipe.tips.length > 0\n ? `## Tips\n\n${recipe.tips.map((tip) => `- ${tip}`).join(\"\\n\")}`\n : \"\"\n}\n\n${\n recipe.relatedRecipes && recipe.relatedRecipes.length > 0\n ? `## Related Recipes\n\n${recipe.relatedRecipes.map((r) => `- ${r}`).join(\"\\n\")}`\n : \"\"\n}\n`;\n\n return textResponse(output.trim());\n}\n\n/**\n * Search for recipes\n */\nexport function searchRecipes(args: SearchRecipesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchRecipesData(query);\n\n if (results.length === 0) {\n const allRecipeIds = Object.keys(recipes);\n return textResponse(\n `No recipes found matching \"${query}\". Available recipes: ${allRecipeIds.join(', ')}. Try searching by category (auth, forms, navigation, settings, layout, data, media) or use list_recipes to see all.`\n );\n }\n\n const resultList = results.map((recipe) => ({\n id: Object.entries(recipes).find(([_, r]) => r === recipe)?.[0],\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Install Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get detailed installation guide for a package\n */\nexport function getInstallGuide(args: GetInstallGuideArgs): ToolResponse {\n const packageName = args.package;\n\n if (!packageName) {\n return textResponse(\"Please provide a package name.\");\n }\n\n const guide = getInstallGuideData(packageName);\n\n if (!guide) {\n const availablePackages = Object.keys(installGuides).join(\", \");\n return textResponse(\n `No installation guide found for \"${packageName}\".\\n\\nAvailable packages: ${availablePackages}`\n );\n }\n\n // Format as detailed markdown\n const markdown = formatInstallGuideMarkdown(guide);\n return textResponse(markdown);\n}\n\n// ============================================================================\n// Intro Tool Handlers\n// ============================================================================\n\n/**\n * Get a comprehensive introduction to the Idealyst framework\n */\nexport function getIntro(_args: GetIntroArgs = {}): ToolResponse {\n return textResponse(idealystIntro);\n}\n\n// ============================================================================\n// Handler Registry\n// ============================================================================\n\n/**\n * Map of all tool handlers by name.\n * Use this for dynamic tool dispatch.\n */\nexport const toolHandlers: Record<string, (args: any) => ToolResponse> = {\n list_components: listComponents,\n get_component_docs: getComponentDocs,\n get_component_example: getComponentExample,\n search_components: searchComponents,\n get_component_types: getComponentTypes,\n get_component_examples_ts: getComponentExamplesTs,\n get_cli_usage: getCliUsage,\n search_icons: searchIcons,\n get_theme_types: getThemeTypes,\n get_navigation_types: getNavigationTypes,\n get_translate_guide: getTranslateGuide,\n get_storage_guide: getStorageGuide,\n get_audio_guide: getAudioGuide,\n get_camera_guide: getCameraGuide,\n get_files_guide: getFilesGuide,\n get_oauth_client_guide: getOauthClientGuide,\n get_animate_guide: getAnimateGuide,\n get_datagrid_guide: getDatagridGuide,\n get_datepicker_guide: getDatepickerGuide,\n get_lottie_guide: getLottieGuide,\n get_markdown_guide: getMarkdownGuide,\n get_config_guide: getConfigGuide,\n get_charts_guide: getChartsGuide,\n list_packages: listPackages,\n get_package_docs: getPackageDocs,\n search_packages: searchPackages,\n list_recipes: listRecipes,\n get_recipe: getRecipe,\n search_recipes: searchRecipes,\n get_install_guide: getInstallGuide,\n get_intro: getIntro,\n};\n\n/**\n * Call a tool by name with arguments.\n * Returns a tool response or throws if the tool is not found.\n */\nexport function callTool(name: string, args: Record<string, unknown> = {}): ToolResponse {\n const handler = toolHandlers[name];\n\n if (!handler) {\n return textResponse(`Unknown tool: ${name}`);\n }\n\n return handler(args);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACV9D,oBAAuB;AACvB,mBAAqC;AACrC,IAAAA,gBAKO;;;ACTA,IAAM,kBAA0C;AAAA,EACrD,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FxC,4CAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoH5C,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsThC,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiN5B,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+JvC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsFrC,sCAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyNtC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyJrC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6KrC,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmPpC,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkN3C;;;ACj7DO,IAAM,mBAA2C;AAAA,EACtD,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8FlC,6CAA6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmR7C,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyNzC,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoTxC,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsfvC,gDAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiWhD,2CAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8b7C;;;ACppEO,IAAM,kBAA0C;AAAA,EACrD,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiHjC,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsKpC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2NrC,0CAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsP1C,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6SnC;;;ACthCO,IAAM,gBAAwC;AAAA,EACnD,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkE/B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwG1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuPjC;;;AClaO,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoBlB,IAAM,WAAwC;AAAA,EACnD,YAAY;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,mBAAmB,wBAAwB;AAAA,IAC9D,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,SAAS,YAAY;AAAA,EACzC;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,wBAAwB;AAAA,IAC3C,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,YAAY;AAAA,EAChC;AAAA,EAEA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,wCAAwC;AAAA,IAC3D,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,OAAO;AAAA,EACzC;AAAA,EAEA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,MAAM;AAAA,IAClB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,SAAS,YAAY;AAAA,EACvD;AAAA,EAEA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,oDAAoD;AAAA,IACvE,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,gBAAgB,QAAQ;AAAA,EAC5C;AAAA,EAEA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,YAAY;AAAA,EAChC;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,qCAAqC;AAAA,IACxD,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,SAAS;AAAA,EAC3C;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,iCAAiC;AAAA,IACpD,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwDZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,UAAU,YAAY;AAAA,EAC1C;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,OAAO;AAAA,EACzC;AAAA,EAEA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,iBAAiB;AAAA,IACpC,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,OAAO;AAAA,EACzC;AAAA,EAEA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,mBAAmB;AAAA,IACtC,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,WAAW,YAAY;AAAA,EAC3C;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,UAAU,MAAM;AAAA,IACnC,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,8BAA8B;AAAA,IACjD,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,SAAS;AAAA,EAC7B;AAAA,EAEA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,MAAM;AAAA,IAClB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,KAAK;AAAA,EACzB;AAAA,EAEA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,MAAM;AAAA,IAClB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,SAAS,YAAY;AAAA,EACvD;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,OAAO;AAAA,EACzC;AAAA,EAEA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,SAAS,YAAY;AAAA,EACzC;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB,CAAC,oBAAoB,8BAA8B;AAAA,IACrE,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiCZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,SAAS;AAAA,EAC3C;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0CZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,SAAS,OAAO,SAAS;AAAA,EAC7C;AAAA,EAEA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,IACV,WAAW,CAAC,OAAO,QAAQ;AAAA,IAC3B,qBAAqB;AAAA,IACrB,cACE;AAAA,IACF,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgCZ,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,cAAc,UAAU,SAAS;AAAA,EACrD;AACF;AAKO,SAAS,wBAAuD;AACrE,QAAM,UAAyC,CAAC;AAEhD,aAAW,OAAO,OAAO,OAAO,QAAQ,GAAG;AACzC,QAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC1B,cAAQ,IAAI,QAAQ,IAAI,CAAC;AAAA,IAC3B;AACA,YAAQ,IAAI,QAAQ,EAAE,KAAK,GAAG;AAAA,EAChC;AAEA,SAAO;AACT;AAKO,SAAS,oBAOb;AACD,SAAO,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO;AAAA,IACnD,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,aAAa,IAAI;AAAA,IACjB,WAAW,IAAI;AAAA,IACf,qBAAqB,IAAI;AAAA,EAC3B,EAAE;AACJ;AAKO,SAAS,eAAe,OAA8B;AAC3D,QAAM,aAAa,MAAM,YAAY;AAErC,SAAO,OAAO,OAAO,QAAQ,EAAE;AAAA,IAC7B,CAAC,QACC,IAAI,KAAK,YAAY,EAAE,SAAS,UAAU,KAC1C,IAAI,QAAQ,YAAY,EAAE,SAAS,UAAU,KAC7C,IAAI,YAAY,YAAY,EAAE,SAAS,UAAU,KACjD,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,UAAU,CAAC,KAC7D,IAAI,SAAS,YAAY,EAAE,SAAS,UAAU;AAAA,EAClD;AACF;;;AC9/BO,IAAM,cAAsC;AAAA,EACjD,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,iBAAiB;AAAA,IACpD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0GN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,eAAe,mBAAmB,iBAAiB;AAAA,EACtE;AAAA,EAEA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,iBAAiB;AAAA,IACpD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoJN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,cAAc,oBAAoB;AAAA,EACrD;AAAA,EAEA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,sBAAsB;AAAA,IACzD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoDN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,cAAc,cAAc;AAAA,EAC/C;AACF;;;AC5WO,IAAM,kBAA0C;AAAA,EACrD,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,mBAAmB,mBAAmB;AAAA,IACzE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsJN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,kBAAkB,gBAAgB;AAAA,EACrD;AAAA,EAEA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,mBAAmB,mBAAmB;AAAA,IACzE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA4GN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,iBAAiB;AAAA,EACpC;AAAA,EAEA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aACE;AAAA,IACF,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,sBAAsB;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoLN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,mBAAmB,wBAAwB,kBAAkB;AAAA,EAChF;AACF;;;AC5fO,IAAM,oBAA4C;AAAA,EACvD,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,sBAAsB;AAAA,IACzD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsFN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,qBAAqB,uBAAuB;AAAA,EAC/D;AAAA,EAEA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,sBAAsB;AAAA,IACzD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuEN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,kBAAkB,uBAAuB;AAAA,EAC5D;AAAA,EAEA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,wBAAwB,iBAAiB;AAAA,IAC5E,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA2DN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,kBAAkB,mBAAmB;AAAA,EACxD;AACF;;;ACvRO,IAAM,cAAsC;AAAA,EACjD,aAAa;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,sBAAsB;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA2DN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,eAAe;AAAA,EAClC;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,sBAAsB;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8DN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,WAAW;AAAA,EAC9B;AAAA,EAEA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,sBAAsB;AAAA,IACzD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqMN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,aAAa,eAAe;AAAA,EAC/C;AACF;;;ACvYO,IAAM,gBAAwC;AAAA,EACnD,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,mBAAmB;AAAA,IACtD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoEN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,kBAAkB,oBAAoB;AAAA,EACzD;AAAA,EAEA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,mBAAmB;AAAA,IACtD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmDN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,mBAAmB,oBAAoB;AAAA,EAC1D;AAAA,EAEA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,sBAAsB;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgDN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,WAAW;AAAA,EAC9B;AAAA,EAEA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,iBAAiB;AAAA,IACpD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuCN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAab,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,iBAAiB;AAAA,EACpC;AAAA,EAEA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,mBAAmB;AAAA,IACtD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmFN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,mBAAmB,gBAAgB;AAAA,EACtD;AACF;;;AC5YO,IAAM,eAAuC;AAAA,EAClD,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,sBAAsB;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAyKN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,cAAc,aAAa;AAAA,EAC9C;AACF;;;AC/LO,IAAM,eAAuC;AAAA,EAClD,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU,CAAC,wBAAwB,iBAAiB;AAAA,IACpD,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0HN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMb,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,kBAAkB,sBAAsB;AAAA,EAC3D;AACF;;;AC1HO,IAAM,UAAkC;AAAA,EAC7C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAKO,SAAS,uBAAiD;AAC/D,QAAM,UAAoC,CAAC;AAE3C,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,CAAC,QAAQ,OAAO,QAAQ,GAAG;AAC7B,cAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,IAC9B;AACA,YAAQ,OAAO,QAAQ,EAAE,KAAK,MAAM;AAAA,EACtC;AAEA,SAAO;AACT;AAaA,IAAM,iBAA2C;AAAA,EAC/C,SAAS,CAAC,YAAY,WAAW,QAAQ,UAAU,MAAM;AAAA,EACzD,SAAS,CAAC,WAAW,YAAY,MAAM;AAAA,EACvC,MAAM,CAAC,WAAW,WAAW,QAAQ;AAAA,EACrC,aAAa,CAAC,UAAU;AAAA,EACxB,MAAM,CAAC,SAAS,YAAY;AAAA,EAC5B,OAAO,CAAC,SAAS,YAAY;AAAA,EAC7B,YAAY,CAAC,OAAO;AAAA,EACpB,UAAU,CAAC,UAAU,SAAS;AAAA,EAC9B,QAAQ,CAAC,SAAS,SAAS;AAAA,EAC3B,WAAW,CAAC,OAAO;AAAA,EACnB,WAAW,CAAC,QAAQ;AAAA,EACpB,OAAO,CAAC,WAAW,UAAU,OAAO;AAAA,EACpC,OAAO,CAAC,SAAS,UAAU,SAAS;AAAA,EACpC,OAAO,CAAC,YAAY,QAAQ,MAAM;AAAA,EAClC,MAAM,CAAC,YAAY,QAAQ,MAAM;AAAA,EACjC,QAAQ,CAAC,QAAQ,SAAS,OAAO;AAAA,EACjC,QAAQ,CAAC,QAAQ,SAAS,QAAQ;AAAA,EAClC,SAAS,CAAC,UAAU;AAAA,EACpB,SAAS,CAAC,WAAW,UAAU;AAAA,EAC/B,KAAK,CAAC,QAAQ,WAAW,UAAU,QAAQ;AAAA,EAC3C,SAAS,CAAC,QAAQ,OAAO,UAAU,QAAQ;AAAA,EAC3C,QAAQ,CAAC,OAAO,WAAW,MAAM;AAAA,EACjC,QAAQ,CAAC,QAAQ,KAAK;AAAA,EACtB,UAAU,CAAC,UAAU,QAAQ,MAAM;AAAA,EACnC,QAAQ,CAAC,YAAY,MAAM;AAAA,EAC3B,MAAM,CAAC,QAAQ,QAAQ,MAAM;AAAA,EAC7B,MAAM,CAAC,QAAQ,MAAM;AACvB;AAOO,SAAS,cAAc,OAAyB;AACrD,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,aAAa,WAAW,MAAM,KAAK,EAAE,OAAO,OAAO;AAGzD,QAAM,gBAAgB,IAAI,IAAI,UAAU;AACxC,aAAW,QAAQ,YAAY;AAC7B,UAAM,OAAO,eAAe,IAAI;AAChC,QAAI,MAAM;AACR,iBAAW,OAAO,KAAM,eAAc,IAAI,GAAG;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO,OAAO,QAAQ,OAAO,EAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM;AACnB,UAAM,aAAa,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,WAAW,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,EAAE,kBAAkB,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,YAAY;AAG9I,QAAI,WAAW,SAAS,UAAU,EAAG,QAAO;AAG5C,QAAI,WAAW,SAAS,KAAK,WAAW,MAAM,OAAK,WAAW,SAAS,CAAC,CAAC,EAAG,QAAO;AAGnF,eAAW,QAAQ,eAAe;AAChC,UAAI,WAAW,SAAS,IAAI,EAAG,QAAO;AAAA,IACxC;AAEA,WAAO;AAAA,EACT,CAAC,EACA,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACtB;AAKO,SAAS,mBAOb;AACD,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO;AAAA,IACpD;AAAA,IACA,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,EACnB,EAAE;AACJ;;;AC3IO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,EACf;AACF;AAEO,IAAM,6BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEO,IAAM,gCAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,SAAS,YAAY,cAAc,aAAa;AAAA,MACzD;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEO,IAAM,6BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,UAAU,QAAQ,WAAW,cAAc,WAAW,MAAM;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,8BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,cAAc,QAAQ,MAAM;AAAA,MACrC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEO,IAAM,mCAAmD;AAAA,EAC9D,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAMO,IAAM,wBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,wBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAMO,IAAM,0BAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,cAAc,QAAQ,MAAM;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,+BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,cAAc,QAAQ,MAAM;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,8BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,4BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,0BAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,0BAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,gCAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,4BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,6BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,+BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,6BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,OAAO,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAMO,IAAM,yBAAyC;AAAA,EACpD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,QAAQ,MAAM,SAAS,QAAQ,QAAQ,WAAW,SAAS;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,YAAY,gBAAgB,YAAY,cAAc,KAAK;AAAA,MACpE;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AACF;AAEO,IAAM,2BAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAMO,IAAM,wBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,YAAY,gBAAgB,UAAU;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,sBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,QAAQ;AAAA,EACrB;AACF;AAEO,IAAM,0BAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAMO,IAAM,4BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AACF;AAMO,IAAM,qBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,EACf;AACF;AAUO,IAAM,kBAAoC;AAAA;AAAA,EAE/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;AAMO,IAAM,oBACX,OAAO,YAAY,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;;;ACtoB9D,IAAM,oBAAuD;AAAA,EAClE,WAAW;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB;AAAA,IACjB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,mBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AACZ;AAKO,SAAS,kBAAkB,eAA2C;AAE3E,MAAI,kBAAkB,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,cAAc,YAAY;AAC5C,QAAM,cAAc,OAAO,KAAK,iBAAiB,EAAE;AAAA,IACjD,CAAC,SAAS,KAAK,YAAY,MAAM;AAAA,EACnC;AACA,MAAI,YAAa,QAAO;AAGxB,SAAO,iBAAiB,SAAS;AACnC;AAKO,SAAS,qBAAqB,eAAsD;AACzF,QAAM,gBAAgB,kBAAkB,aAAa;AACrD,SAAO,gBAAgB,kBAAkB,aAAa,IAAI;AAC5D;AAKO,SAAS,oBAA8B;AAC5C,SAAO,OAAO,KAAK,iBAAiB;AACtC;AAKO,SAAS,iBAAiB,OAAe,UAA6B;AAC3E,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,aAAa,WAAW,MAAM,KAAK,EAAE,OAAO,OAAO;AAGzD,QAAM,aAAa,iBAAiB,UAAU;AAE9C,SAAO,OAAO,QAAQ,iBAAiB,EACpC,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM;AACxB,QAAI,YAAY,KAAK,aAAa,UAAU;AAC1C,aAAO;AAAA,IACT;AAGA,QAAI,cAAc,SAAS,WAAY,QAAO;AAE9C,UAAM,aAAa,GAAG,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,SAAS,KAAK,GAAG,CAAC,GAAG,YAAY;AAGxF,QAAI,WAAW,SAAS,UAAU,EAAG,QAAO;AAG5C,QAAI,WAAW,SAAS,KAAK,WAAW,MAAM,OAAK,WAAW,SAAS,CAAC,CAAC,EAAG,QAAO;AAEnF,WAAO;AAAA,EACT,CAAC,EACA,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACzB;AAKO,SAAS,wBAAwB,UAA4B;AAClE,SAAO,OAAO,QAAQ,iBAAiB,EACpC,OAAO,CAAC,CAAC,GAAG,IAAI,MAAM,KAAK,aAAa,QAAQ,EAChD,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACzB;;;ACzuBO,IAAM,cAAmC;AAAA,EAC9C,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS,CAAC;AAAA,IACV,UAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC/FO,IAAM,cAAsC;AAAA,EACjD,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0C7B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6MxB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgN/B;;;ACzcO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyD9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkOzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HhC;;;AC1ZO,IAAM,cAAsC;AAAA,EACjD,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiE7B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmQxB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2O/B;;;ACjjBO,IAAM,oBAA4C;AAAA,EACvD,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+CpC,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0D/B,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2GtC;;;ACrNO,IAAM,gBAAwC;AAAA,EACnD,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkD/B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6O1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuQjC;;;ACtiBO,IAAM,iBAAyC;AAAA,EACpD,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6DhC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgJ3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2LlC;;;AC1YO,IAAM,mBAA2C;AAAA,EACtD,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDlC,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqG7B,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0HpC;;;AChRO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2C9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqFzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqIhC;;;ACtQO,IAAM,iBAAyC;AAAA,EACpD,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkDhC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+G3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8HlC;;;AChSO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+C9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiFzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EhC;;;AC9MO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8D9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuKzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACd7B;AAAA,EACE,OAAS;AAAA,EACT,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAC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","names":["import_types","__filename","searchComponents","getComponentTypes","getThemeTypes","getNavigationTypes","searchPackages","searchRecipes","getInstallGuide"]}
|