solfaces 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -16
- package/SKILL.md +2 -2
- package/dist/agent/index.cjs +12 -12
- package/dist/agent/index.js +2 -2
- package/dist/agent/mcp-server.cjs +7 -6
- package/dist/{chunk-66PSL4YO.js → chunk-74CSG63X.js} +5 -5
- package/dist/{chunk-66PSL4YO.js.map → chunk-74CSG63X.js.map} +1 -1
- package/dist/{chunk-4YFZ4W2Y.cjs → chunk-PVJR3SFG.cjs} +10 -10
- package/dist/{chunk-4YFZ4W2Y.cjs.map → chunk-PVJR3SFG.cjs.map} +1 -1
- package/dist/{chunk-N5DDJ3WQ.js → chunk-UTT764K6.js} +10 -9
- package/dist/{chunk-N5DDJ3WQ.js.map → chunk-UTT764K6.js.map} +1 -1
- package/dist/{chunk-XXJJH56O.cjs → chunk-YGD7EQEX.cjs} +10 -9
- package/dist/{chunk-XXJJH56O.cjs.map → chunk-YGD7EQEX.cjs.map} +1 -1
- package/dist/index.cjs +11 -11
- package/dist/index.js +2 -2
- package/dist/names/index.cjs +9 -9
- package/dist/names/index.d.cts +4 -2
- package/dist/names/index.d.ts +4 -2
- package/dist/names/index.js +1 -1
- package/dist/react/index.cjs +5 -5
- package/dist/react/index.js +1 -1
- package/dist/solfaces.cdn.global.js +1 -1
- package/dist/solfaces.cdn.global.js.map +1 -1
- package/package.json +1 -1
- package/python/solfaces.py +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cdn.ts","../src/core/traits.ts","../src/names/sha256.ts","../src/names/constants.ts","../src/names/derive.ts","../src/core/colors.ts","../src/core/renderer.ts","../src/core/describe.ts","../src/themes/presets.ts"],"sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — CDN Bundle (IIFE / UMD)\n// Single <script> tag integration. No build step required.\n//\n// Usage:\n// <script src=\"https://unpkg.com/solfaces/dist/solfaces.cdn.js\"></script>\n// <div data-solface=\"7xKXq...\" data-solface-size=\"48\"></div>\n// <script>SolFaces.autoInit();</script>\n//\n// Or programmatic:\n// <script>\n// const svg = SolFaces.renderSVG(\"7xKXq...\", { size: 64 });\n// document.getElementById(\"avatar\").innerHTML = svg;\n// </script>\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, getTraitLabels, traitHash, resolveTheme, effectiveAccessory } from \"./core/traits\";\nimport { deriveName, deriveIdentity } from \"./names\";\nimport { renderSolFaceSVG, renderSolFaceDataURI, renderSolFaceBase64 } from \"./core/renderer\";\nimport { describeAppearance, solFaceAltText, agentAppearancePrompt } from \"./core/describe\";\nimport { hexToRgb, rgbToHex, darken, lighten, blend, luminance, deriveSkinColors } from \"./core/colors\";\nimport { PRESET_THEMES, getPresetTheme } from \"./themes/presets\";\n\nimport type { RenderOptions } from \"./core/traits\";\n\n// ─── DOM Helpers ─────────────────────────────────────────────\n\nfunction mountSolFace(\n element: HTMLElement | string,\n walletAddress: string,\n options?: RenderOptions,\n): () => void {\n const el = typeof element === \"string\"\n ? document.querySelector<HTMLElement>(element)\n : element;\n\n if (!el) {\n console.warn(`[SolFaces] Element not found: ${element}`);\n return () => {};\n }\n\n el.innerHTML = renderSolFaceSVG(walletAddress, options);\n return () => { el.innerHTML = \"\"; };\n}\n\nfunction setSolFaceImg(\n img: HTMLImageElement | string,\n walletAddress: string,\n options?: RenderOptions,\n): void {\n const el = typeof img === \"string\"\n ? document.querySelector<HTMLImageElement>(img)\n : img;\n\n if (!el) return;\n el.src = renderSolFaceDataURI(walletAddress, options);\n el.alt = solFaceAltText(walletAddress);\n}\n\nfunction autoInit(root: HTMLElement | Document = document): void {\n const elements = root.querySelectorAll<HTMLElement>(\"[data-solface]\");\n elements.forEach((el) => {\n const wallet = el.getAttribute(\"data-solface\");\n if (!wallet) return;\n\n const size = parseInt(el.getAttribute(\"data-solface-size\") ?? \"64\", 10);\n const blink = el.getAttribute(\"data-solface-blink\") === \"true\";\n const themeName = el.getAttribute(\"data-solface-theme\") as string | null;\n const flat = el.getAttribute(\"data-solface-flat\") === \"true\";\n const detail = el.getAttribute(\"data-solface-detail\") as \"full\" | \"simplified\" | \"auto\" | null;\n\n let theme = themeName && themeName in PRESET_THEMES\n ? PRESET_THEMES[themeName as keyof typeof PRESET_THEMES]\n : undefined;\n\n if (flat && theme) {\n theme = { ...theme, flat: true };\n } else if (flat) {\n theme = { flat: true };\n }\n\n mountSolFace(el, wallet, {\n size,\n enableBlink: blink,\n theme,\n detail: detail ?? \"auto\",\n });\n });\n}\n\n// ─── Global API ──────────────────────────────────────────────\n\nconst SolFaces = {\n // Core\n generateTraits,\n deriveName,\n deriveIdentity,\n getTraitLabels,\n traitHash,\n resolveTheme,\n effectiveAccessory,\n\n // Rendering\n renderSVG: renderSolFaceSVG,\n renderDataURI: renderSolFaceDataURI,\n renderBase64: renderSolFaceBase64,\n\n // AI / Description\n describe: describeAppearance,\n altText: solFaceAltText,\n agentPrompt: agentAppearancePrompt,\n\n // DOM\n mount: mountSolFace,\n setImg: setSolFaceImg,\n autoInit,\n\n // Themes\n themes: PRESET_THEMES,\n getTheme: getPresetTheme,\n\n // Color utilities\n colors: { hexToRgb, rgbToHex, darken, lighten, blend, luminance, deriveSkinColors },\n};\n\n// Attach to window for <script> tag usage\nif (typeof window !== \"undefined\") {\n (window as unknown as Record<string, unknown>).SolFaces = SolFaces;\n}\n\n// Auto-initialize on DOMContentLoaded if data-solface elements exist\nif (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n if (document.querySelector(\"[data-solface]\")) {\n autoInit();\n }\n });\n } else {\n if (document.querySelector(\"[data-solface]\")) {\n autoInit();\n }\n }\n}\n\nexport default SolFaces;\n","// ═══════════════════════════════════════════════════\n// SOLFACES v2 — Deterministic avatar trait engine\n// ═══════════════════════════════════════════════════\n\n// ─── Types ────────────────────────────────────────\n\nexport interface SolFaceTraits {\n faceShape: number; // 0-3 (consumed for PRNG ordering, all render as squircle)\n skinColor: number; // 0-9\n eyeStyle: number; // 0-7\n eyeColor: number; // 0-4\n eyebrows: number; // 0-4\n nose: number; // 0-3\n mouth: number; // 0-7\n hairStyle: number; // 0-9\n hairColor: number; // 0-9\n accessory: number; // 0-9\n bgColor: number; // 0-9\n}\n\nexport interface SolFaceTheme {\n // Palette overrides\n skinColors?: string[];\n eyeColors?: string[];\n hairColors?: string[];\n bgColors?: string[];\n\n // Single-color overrides\n mouthColor?: string;\n eyebrowColor?: string;\n accessoryColor?: string;\n eyeWhiteColor?: string;\n noseColor?: string;\n glassesColor?: string;\n earringColor?: string;\n headbandColor?: string;\n\n // Layout\n bgOpacity?: number;\n bgRadius?: number;\n border?: { color: string; width: number };\n\n // Rendering options\n flat?: boolean;\n cheekEnabled?: boolean;\n cheekColor?: string;\n cheekOpacity?: number;\n skinOpacity?: number;\n shadowEnabled?: boolean;\n glowIntensity?: number;\n\n // React-only: pixel art mode\n _pixel?: boolean;\n _pixelDensity?: number;\n _pixelRounded?: boolean;\n _pixelOutline?: boolean;\n _pixelOutlineColor?: string;\n _pixelOutlineWidth?: number;\n _pixelContrast?: number;\n _pixelSaturation?: number;\n _pixelBrightness?: number;\n _pixelScanlines?: boolean;\n _pixelScanlineOpacity?: number;\n _pixelScanlineSpacing?: number;\n _pixelGrid?: boolean;\n _pixelGridOpacity?: number;\n _pixelGridColor?: string;\n _pixelShadow?: boolean;\n _pixelShadowColor?: string;\n _pixelShadowOffset?: number;\n\n // React-only: liquid glass mode\n _glass?: boolean;\n _blurRadius?: number;\n _saturate?: number;\n _tintOpacity?: number;\n _tintColor?: string;\n _borderOpacity?: number;\n _borderWidth?: number;\n _borderColor?: string;\n _specularOpacity?: number;\n _specularColor?: string;\n _specularEnd?: number;\n _lightAngle?: number;\n _rimIntensity?: number;\n _shadow?: string;\n}\n\nexport interface RenderOptions {\n size?: number;\n theme?: SolFaceTheme;\n traitOverrides?: Partial<SolFaceTraits>;\n enableBlink?: boolean | {\n duration?: number;\n delay?: number;\n };\n className?: string;\n detail?: \"full\" | \"simplified\" | \"auto\";\n colorOverrides?: {\n skin?: string;\n eyes?: string;\n hair?: string;\n bg?: string;\n mouth?: string;\n eyebrow?: string;\n accessory?: string;\n nose?: string;\n eyeWhite?: string;\n };\n}\n\n// ─── Color Palettes ──────────────────────────────\n\nexport const SKIN_COLORS = [\n \"#faeae5\", \"#efd6c8\", \"#e4c5aa\", \"#d5b590\", \"#c59e77\",\n \"#b4875f\", \"#9d6d4d\", \"#805742\", \"#654134\", \"#4b2d25\",\n];\n\nexport const EYE_COLORS = [\n \"#382414\", \"#3868A8\", \"#38784C\", \"#808838\", \"#586878\",\n];\n\nexport const HAIR_COLORS = [\n \"#1A1A24\", \"#4C3428\", \"#887058\", \"#D4B868\", \"#A84830\",\n \"#C0C0CC\", \"#484858\", \"#783850\", \"#D8B0A0\", \"#C08048\",\n];\n\nexport const BG_COLORS = [\n \"#b98387\", \"#a9a360\", \"#9eb785\", \"#69ab79\", \"#81bbb0\",\n \"#6499af\", \"#7f8bbd\", \"#8869ab\", \"#b785b3\", \"#ab6984\",\n];\n\n// ─── Hashing (djb2) ─────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── PRNG (mulberry32) ──────────────────────────\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n// ─── Trait Generation ───────────────────────────\n\nexport function generateTraits(\n walletAddress: string,\n overrides?: Partial<SolFaceTraits>\n): SolFaceTraits {\n const seed = djb2(walletAddress);\n const rand = mulberry32(seed);\n\n // IMPORTANT: Order must NEVER change — shifts all downstream values.\n // faceShape is consumed for PRNG ordering but unused in rendering (all squircle).\n const traits: SolFaceTraits = {\n faceShape: Math.floor(rand() * 4),\n skinColor: Math.floor(rand() * 10),\n eyeStyle: Math.floor(rand() * 8),\n eyeColor: Math.floor(rand() * 5),\n eyebrows: Math.floor(rand() * 5),\n nose: Math.floor(rand() * 4),\n mouth: Math.floor(rand() * 8),\n hairStyle: Math.floor(rand() * 10),\n hairColor: Math.floor(rand() * 10),\n accessory: Math.floor(rand() * 10),\n bgColor: Math.floor(rand() * 10),\n };\n\n return overrides ? { ...traits, ...overrides } : traits;\n}\n\n// ─── Effective Accessory ────────────────────────\n// Earrings/studs are suppressed on long/bob hair\n\nexport function effectiveAccessory(traits: SolFaceTraits): number {\n const ai = traits.accessory % 10;\n const hi = traits.hairStyle % 10;\n if ((ai === 4 || ai === 7) && (hi === 5 || hi === 6)) return 0;\n return ai;\n}\n\n// ─── Trait Labels ───────────────────────────────\n\nconst FACE_LABELS = [\"Squircle\"];\nconst SKIN_LABELS = [\n \"Porcelain\", \"Ivory\", \"Fair\", \"Light\", \"Sand\",\n \"Golden\", \"Warm\", \"Caramel\", \"Brown\", \"Deep\",\n];\nconst EYE_STYLE_LABELS = [\"Round\", \"Minimal\", \"Almond\", \"Wide\", \"Relaxed\", \"Joyful\", \"Bright\", \"Gentle\"];\nconst EYE_COLOR_LABELS = [\"Chocolate\", \"Sky\", \"Emerald\", \"Hazel\", \"Storm\"];\nconst BROW_LABELS = [\"Wispy\", \"Straight\", \"Natural\", \"Arched\", \"Angled\"];\nconst NOSE_LABELS = [\"Shadow\", \"Button\", \"Soft\", \"Nostrils\"];\nconst MOUTH_LABELS = [\"Smile\", \"Calm\", \"Happy\", \"Oh\", \"Smirk\", \"Grin\", \"Flat\", \"Pout\"];\nconst HAIR_STYLE_LABELS = [\n \"Bald\", \"Short\", \"Curly\", \"Side Sweep\", \"Puff\",\n \"Long\", \"Bob\", \"Buzz\", \"Wavy\", \"Topknot\",\n];\nconst HAIR_COLOR_LABELS = [\n \"Black\", \"Espresso\", \"Walnut\", \"Honey\", \"Copper\",\n \"Silver\", \"Charcoal\", \"Burgundy\", \"Strawberry\", \"Ginger\",\n];\nconst ACCESSORY_LABELS = [\n \"None\", \"Beauty Mark\", \"Round Glasses\", \"Rect Glasses\", \"Earring\",\n \"Headband\", \"Freckles\", \"Stud Earrings\", \"Aviators\", \"Band-Aid\",\n];\nconst BG_COLOR_LABELS = [\n \"Rose\", \"Olive\", \"Sage\", \"Fern\", \"Mint\",\n \"Ocean\", \"Sky\", \"Lavender\", \"Orchid\", \"Blush\",\n];\n\nexport function getTraitLabels(traits: SolFaceTraits): Record<string, string> {\n return {\n faceShape: FACE_LABELS[0],\n skinColor: SKIN_LABELS[traits.skinColor] ?? \"Fair\",\n eyeStyle: EYE_STYLE_LABELS[traits.eyeStyle] ?? \"Round\",\n eyeColor: EYE_COLOR_LABELS[traits.eyeColor] ?? \"Chocolate\",\n eyebrows: BROW_LABELS[traits.eyebrows] ?? \"Wispy\",\n nose: NOSE_LABELS[traits.nose] ?? \"Shadow\",\n mouth: MOUTH_LABELS[traits.mouth] ?? \"Smile\",\n hairStyle: HAIR_STYLE_LABELS[traits.hairStyle] ?? \"Bald\",\n hairColor: HAIR_COLOR_LABELS[traits.hairColor] ?? \"Black\",\n accessory: ACCESSORY_LABELS[effectiveAccessory(traits)] ?? \"None\",\n bgColor: BG_COLOR_LABELS[traits.bgColor] ?? \"Rose\",\n };\n}\n\n// ─── Trait Hash ─────────────────────────────────\n\nexport function traitHash(walletAddress: string): string {\n return (djb2(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// ─── Theme Utilities ────────────────────────────\n\nexport function resolveTheme(\n themeName?: string,\n themes?: Record<string, SolFaceTheme>\n): SolFaceTheme | undefined {\n if (!themeName || !themes) return undefined;\n return themes[themeName];\n}\n\nexport function mergeTheme(\n base: SolFaceTheme | null | undefined,\n overrides: SolFaceTheme | null | undefined\n): SolFaceTheme | null {\n if (!base) return overrides || null;\n if (!overrides) return base;\n return { ...base, ...overrides };\n}\n","// ═══════════════════════════════════════════════════════════════\n// Pure-JS SHA-256 — NIST FIPS 180-4\n// Synchronous, zero dependencies, works in all JS environments.\n// ═══════════════════════════════════════════════════════════════\n\nconst K: readonly number[] = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction rotr(n: number, x: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n\nexport function sha256(input: string): Uint8Array {\n // Encode UTF-8\n const encoder = new TextEncoder();\n const msg = encoder.encode(input);\n const bitLen = msg.length * 8;\n\n // Padding: append 1-bit, zeros, then 64-bit big-endian length\n const padLen = 64 - ((msg.length + 9) % 64);\n const totalLen = msg.length + 1 + (padLen === 64 ? 0 : padLen) + 8;\n const buf = new Uint8Array(totalLen);\n buf.set(msg);\n buf[msg.length] = 0x80;\n // Write 64-bit big-endian length (we only use lower 32 bits since JS strings are limited)\n const dv = new DataView(buf.buffer);\n dv.setUint32(totalLen - 4, bitLen, false);\n\n // Initial hash values\n let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;\n let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\n\n const W = new Int32Array(64);\n\n // Process each 512-bit (64-byte) block\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let i = 0; i < 16; i++) {\n W[i] = dv.getInt32(offset + i * 4, false);\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(7, W[i - 15]) ^ rotr(18, W[i - 15]) ^ (W[i - 15] >>> 3);\n const s1 = rotr(17, W[i - 2]) ^ rotr(19, W[i - 2]) ^ (W[i - 2] >>> 10);\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) | 0;\n }\n\n let a = h0, b = h1, c = h2, d = h3;\n let e = h4, f = h5, g = h6, h = h7;\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(6, e) ^ rotr(11, e) ^ rotr(25, e);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[i] + W[i]) | 0;\n const S0 = rotr(2, a) ^ rotr(13, a) ^ rotr(22, a);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + maj) | 0;\n\n h = g; g = f; f = e; e = (d + temp1) | 0;\n d = c; c = b; b = a; a = (temp1 + temp2) | 0;\n }\n\n h0 = (h0 + a) | 0; h1 = (h1 + b) | 0;\n h2 = (h2 + c) | 0; h3 = (h3 + d) | 0;\n h4 = (h4 + e) | 0; h5 = (h5 + f) | 0;\n h6 = (h6 + g) | 0; h7 = (h7 + h) | 0;\n }\n\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, h0, false); outView.setUint32(4, h1, false);\n outView.setUint32(8, h2, false); outView.setUint32(12, h3, false);\n outView.setUint32(16, h4, false); outView.setUint32(20, h5, false);\n outView.setUint32(24, h6, false); outView.setUint32(28, h7, false);\n return out;\n}\n\nexport function sha256Hex(input: string): string {\n return Array.from(sha256(input))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n","// ═══════════════════════════════════════════════════════════════\n// SolNames v1 — Word Lists & Constants\n// 1000 adjectives × 1000 nouns = 1,000,000 display name combos.\n// All words are positive or neutral. No negative, offensive, or\n// embarrassing terms. PascalCase for concatenation readability.\n// ═══════════════════════════════════════════════════════════════\n\nexport const SOLNAMES_VERSION = \"v1\" as const;\n\nexport type NameFormat = \"short\" | \"display\" | \"tag\" | \"full\";\n\nexport interface SolNameIdentity {\n short: string;\n name: string;\n tag: string;\n full: string;\n adjective: string;\n noun: string;\n hash: string;\n discriminator: string;\n}\n\n// ─── Adjectives (1000) ──────────────────────────────────────────\nexport const ADJECTIVES: readonly string[] = Object.freeze([\n \"Frost\",\"Solar\",\"Coral\",\"Amber\",\"Mossy\",\"Lunar\",\"Misty\",\"Alpine\",\n \"Autumn\",\"Breeze\",\"Cerulean\",\"Cloudy\",\"Cosmic\",\"Crystal\",\"Dewy\",\"Dusty\",\n \"Earthy\",\"Floral\",\"Forest\",\"Frozen\",\"Glacial\",\"Golden\",\"Grassy\",\"Harbor\",\n \"Ivory\",\"Jasmine\",\"Lagoon\",\"Leafy\",\"Lush\",\"Marine\",\"Meadow\",\"Mineral\",\n \"Mosaic\",\"Nectar\",\"Nordic\",\"Oceanic\",\"Orchid\",\"Pearly\",\"Petal\",\"Polar\",\n \"Prairie\",\"Rain\",\"River\",\"Rocky\",\"Sandy\",\"Savanna\",\"Shore\",\"Sierra\",\n \"Snowy\",\"Spring\",\"Starry\",\"Stone\",\"Summer\",\"Sunset\",\"Tidal\",\"Timber\",\n \"Tropic\",\"Tundra\",\"Valley\",\"Verdant\",\"Winding\",\"Winter\",\"Woody\",\"Bloom\",\n \"Blossom\",\"Brook\",\"Canyon\",\"Cedar\",\"Cloud\",\"Comet\",\"Copper\",\"Dawn\",\n \"Delta\",\"Dune\",\"Eclipse\",\"Fern\",\"Flame\",\"Flora\",\"Glade\",\"Azure\",\n \"Cobalt\",\"Crimson\",\"Indigo\",\"Scarlet\",\"Sapphire\",\"Emerald\",\"Ruby\",\"Garnet\",\n \"Onyx\",\"Jade\",\"Turquoise\",\"Magenta\",\"Plum\",\"Russet\",\"Tawny\",\"Burnt\",\n \"Gilded\",\"Platinum\",\"Bronze\",\"Chrome\",\"Pearl\",\"Opal\",\"Blush\",\"Rosy\",\n \"Dusky\",\"Inky\",\"Ashen\",\"Cream\",\"Slate\",\"Charcoal\",\"Steel\",\"Pewter\",\n \"Honey\",\"Saffron\",\"Citrus\",\"Lemon\",\"Tangerine\",\"Peach\",\"Apricot\",\"Vermilion\",\n \"Mauve\",\"Lilac\",\"Periwinkle\",\"Cerise\",\"Maroon\",\"Burgundy\",\"Wine\",\"Berry\",\n \"Cherry\",\"Mint\",\"Olive\",\"Teal\",\"Navy\",\"Cyan\",\"Neon\",\"Pastel\",\n \"Muted\",\"Lustrous\",\"Gleaming\",\"Glossy\",\"Shining\",\"Glowing\",\"Luminous\",\"Brilliant\",\n \"Sparkling\",\"Shimmering\",\"Iridescent\",\"Prismatic\",\"Spectral\",\"Twilight\",\"Sunrise\",\"Sunlit\",\n \"Moonlit\",\"Starlit\",\"Candlelit\",\"Firelit\",\"Sunbeam\",\"Afterglow\",\"Halo\",\"Flicker\",\n \"Glow\",\"Ray\",\"Beam\",\"Blaze\",\"Glint\",\"Spark\",\"Arc\",\"Prism\",\n \"Spectrum\",\"Rainbow\",\"Aurora\",\"Nebula\",\"Stellar\",\"Astral\",\"Lucent\",\"Frosted\",\n \"Swift\",\"Bold\",\"Keen\",\"Brave\",\"Noble\",\"Serene\",\"Fierce\",\"Gentle\",\n \"Agile\",\"Alert\",\"Astute\",\"Candid\",\"Clever\",\"Daring\",\"Eager\",\"Earnest\",\n \"Fair\",\"Gallant\",\"Graceful\",\"Hardy\",\"Honest\",\"Humble\",\"Jovial\",\"Joyful\",\n \"Kind\",\"Loyal\",\"Merry\",\"Mindful\",\"Nimble\",\"Patient\",\"Plucky\",\"Proud\",\n \"Quick\",\"Ready\",\"Resilient\",\"Savvy\",\"Sincere\",\"Skilled\",\"Steady\",\"Stout\",\n \"Strong\",\"Sure\",\"Tender\",\"True\",\"Valiant\",\"Willing\",\"Wise\",\"Witty\",\n \"Worthy\",\"Zealous\",\"Active\",\"Adept\",\"Ardent\",\"Avid\",\"Benign\",\"Bright\",\n \"Civil\",\"Clean\",\"Clear\",\"Composed\",\"Content\",\"Courtly\",\"Crafty\",\"Curious\",\n \"Decent\",\"Devout\",\"Diligent\",\"Direct\",\"Driven\",\"Dynamic\",\"Elegant\",\"Elite\",\n \"Even\",\"Exact\",\"Famed\",\"Fervent\",\"Fine\",\"Firm\",\"Fit\",\"Fluid\",\n \"Focal\",\"Fond\",\"Frank\",\"Free\",\"Fresh\",\"Friendly\",\"Frugal\",\"Gifted\",\n \"Glad\",\"Grand\",\"Great\",\"Green\",\"Grounded\",\"Hale\",\"Happy\",\"Hearty\",\n \"Heroic\",\"Ideal\",\"Infinite\",\"Inner\",\"Intact\",\"Intent\",\"Just\",\"Lively\",\n \"Lucky\",\"Major\",\"Mellow\",\"Mighty\",\"Modest\",\"Natural\",\"Neat\",\"Optimal\",\n \"Original\",\"Pacific\",\"Peaceful\",\"Pious\",\"Pleased\",\"Poised\",\"Polite\",\"Popular\",\n \"Potent\",\"Precious\",\"Premier\",\"Prime\",\"Proper\",\"Proven\",\"Pure\",\"Quiet\",\n \"Rapid\",\"Rare\",\"Real\",\"Regal\",\"Rich\",\"Rising\",\"Robust\",\"Royal\",\n \"Sacred\",\"Safe\",\"Scenic\",\"Secure\",\"Senior\",\"Sharp\",\"Simple\",\"Smart\",\n \"Smooth\",\"Snug\",\"Social\",\"Solid\",\"Sound\",\"Special\",\"Stable\",\"Stately\",\n \"Still\",\"Super\",\"Supreme\",\"Sweet\",\"Thorough\",\"Tidy\",\"Top\",\"Total\",\n \"Tough\",\"Trim\",\"Trusted\",\"Ultimate\",\"Unique\",\"United\",\"Upper\",\"Useful\",\n \"Valid\",\"Valued\",\"Varied\",\"Vital\",\"Vivid\",\"Vocal\",\"Whole\",\"Wide\",\n \"Young\",\"Zesty\",\"Iron\",\"Gold\",\"Silver\",\"Marble\",\"Granite\",\"Velvet\",\n \"Satin\",\"Silk\",\"Linen\",\"Cotton\",\"Suede\",\"Denim\",\"Canvas\",\"Leather\",\n \"Wooden\",\"Bamboo\",\"Wicker\",\"Woven\",\"Braided\",\"Knit\",\"Lace\",\"Mesh\",\n \"Fiber\",\"Glass\",\"Mirror\",\"Diamond\",\"Flint\",\"Basalt\",\"Obsidian\",\"Chalk\",\n \"Clay\",\"Gravel\",\"Pebble\",\"Cobble\",\"Brick\",\"Tile\",\"Resin\",\"Fossil\",\n \"Shell\",\"Bone\",\"Feather\",\"Plush\",\"Brushed\",\"Polished\",\"Hammered\",\"Forged\",\n \"Cast\",\"Molten\",\"Tempered\",\"Etched\",\"Carved\",\"Sculpted\",\"Spun\",\"Pressed\",\n \"Rolled\",\"Folded\",\"Layered\",\"Stacked\",\"Ribbed\",\"Matte\",\"Lacquered\",\"Enameled\",\n \"Glazed\",\"Painted\",\"Dyed\",\"Stained\",\"Refined\",\"Distilled\",\"Purified\",\"Filtered\",\n \"Alloyed\",\"Plated\",\"Coated\",\"Sealed\",\"Bonded\",\"Fused\",\"Welded\",\"Riveted\",\n \"Textured\",\"Grained\",\"Veined\",\"Flecked\",\"Speckled\",\"Dappled\",\"Streaked\",\"Banded\",\n \"Striped\",\"Checkered\",\"Waxed\",\"Oiled\",\"Cured\",\"Tanned\",\"Smoked\",\"Burnished\",\n \"Antiqued\",\"Patina\",\"Weathered\",\"Aged\",\"Rustic\",\"Hewn\",\"Vast\",\"Broad\",\n \"Deep\",\"High\",\"Tall\",\"Giant\",\"Colossal\",\"Massive\",\"Immense\",\"Boundless\",\n \"Endless\",\"Sweeping\",\"Spanning\",\"Extended\",\"Towering\",\"Soaring\",\"Lofty\",\"Elevated\",\n \"Raised\",\"Summit\",\"Apex\",\"Crest\",\"Crown\",\"Pinnacle\",\"Zenith\",\"Ridge\",\n \"Ledge\",\"Level\",\"Hollow\",\"Compact\",\"Dense\",\"Thick\",\"Narrow\",\"Slender\",\n \"Micro\",\"Mini\",\"Small\",\"Ample\",\"Hefty\",\"Jumbo\",\"Mega\",\"Ultra\",\n \"Macro\",\"Central\",\"Core\",\"Outer\",\"Lateral\",\"Radial\",\"Spiral\",\"Orbital\",\n \"Linear\",\"Planar\",\"Spherical\",\"Rounded\",\"Angular\",\"Pointed\",\"Tapered\",\"Curved\",\n \"Arced\",\"Twisted\",\"Coiled\",\"Fractal\",\"Cellular\",\"Quantum\",\"Photon\",\"Plasma\",\n \"Kinetic\",\"Static\",\"Charged\",\"Maximal\",\"Atomic\",\"Nano\",\"Tiered\",\"Strata\",\n \"Nested\",\"Stepped\",\"Graded\",\"Scaled\",\"Proportioned\",\"Modular\",\"Symmetric\",\"Parallel\",\n \"Flowing\",\"Drifting\",\"Gliding\",\"Sailing\",\"Floating\",\"Climbing\",\"Leaping\",\"Bounding\",\n \"Sprinting\",\"Dashing\",\"Rushing\",\"Surging\",\"Cascading\",\"Rolling\",\"Tumbling\",\"Spinning\",\n \"Whirling\",\"Twisting\",\"Swirling\",\"Pulsing\",\"Beating\",\"Humming\",\"Buzzing\",\"Ringing\",\n \"Chiming\",\"Singing\",\"Dancing\",\"Swaying\",\"Waving\",\"Rippling\",\"Bubbling\",\"Fizzing\",\n \"Crackling\",\"Snapping\",\"Clicking\",\"Tapping\",\"Drumming\",\"Thrumming\",\"Vibrant\",\"Magnetic\",\n \"Electric\",\"Blazing\",\"Burning\",\"Fiery\",\"Volcanic\",\"Thermal\",\"Warming\",\"Cooling\",\n \"Chilling\",\"Brisk\",\"Crisp\",\"Breezy\",\"Gusty\",\"Windy\",\"Airy\",\"Light\",\n \"Buoyant\",\"Weightless\",\"Fleet\",\"Peppy\",\"Zippy\",\"Snappy\",\"Speedy\",\"Sonic\",\n \"Turbo\",\"Warp\",\"Express\",\"Instant\",\"Darting\",\"Flying\",\"Jetting\",\"Cruising\",\n \"Coasting\",\"Rhythmic\",\"Cycling\",\"Pacing\",\"Striding\",\"Marching\",\"Trotting\",\"Galloping\",\n \"Bouncing\",\"Vaulting\",\"Arching\",\"Launched\",\"Propelled\",\"Hovering\",\"Orbiting\",\"Revolving\",\n \"Rotating\",\"Pivoting\",\"Swinging\",\"Rocking\",\"Tilting\",\"Shifting\",\"Sliding\",\"Skating\",\n \"Surfing\",\"Diving\",\"Plunging\",\"Dipping\",\"Wading\",\"Celestial\",\"Ethereal\",\"Mystic\",\n \"Arcane\",\"Ancient\",\"Eternal\",\"Timeless\",\"Ageless\",\"Enduring\",\"Lasting\",\"Perpetual\",\n \"Legendary\",\"Mythic\",\"Epic\",\"Fabled\",\"Storied\",\"Historic\",\"Classic\",\"Vintage\",\n \"Retro\",\"Modern\",\"Future\",\"Digital\",\"Cyber\",\"Virtual\",\"Pixel\",\"Binary\",\n \"Omega\",\"Alpha\",\"Beta\",\"Gamma\",\"Sigma\",\"Theta\",\"Lambda\",\"Kappa\",\n \"Zeta\",\"Epsilon\",\"Omni\",\"Dual\",\"Triple\",\"Nexus\",\"Vertex\",\"Vector\",\n \"Matrix\",\"Cipher\",\"Enigma\",\"Phantom\",\"Mirage\",\"Dream\",\"Vision\",\"Oracle\",\n \"Prophet\",\"Sage\",\"Shaman\",\"Druid\",\"Artisan\",\"Maestro\",\"Virtuoso\",\"Savant\",\n \"Prodigy\",\"Maven\",\"Guru\",\"Mentor\",\"Guide\",\"Scout\",\"Pioneer\",\"Voyager\",\n \"Wanderer\",\"Nomad\",\"Rover\",\"Ranger\",\"Sentinel\",\"Guardian\",\"Keeper\",\"Warden\",\n \"Champion\",\"Vanguard\",\"Herald\",\"Emissary\",\"Envoy\",\"Ambassador\",\"Steward\",\"Curator\",\n \"Patron\",\"Benefactor\",\"Founder\",\"Architect\",\"Builder\",\"Maker\",\"Crafter\",\"Weaver\",\n \"Forger\",\"Smith\",\"Wright\",\"Mason\",\"Brewer\",\"Baker\",\"Tanner\",\"Dyer\",\n \"Scribe\",\"Bard\",\"Minstrel\",\"Troubadour\",\"Storyteller\",\"Chronicler\",\"Lorekeeper\",\"Archivist\",\n \"Tranquil\",\"Placid\",\"Hushed\",\"Muffled\",\"Soft\",\"Subtle\",\"Faint\",\"Dim\",\n \"Pale\",\"Warm\",\"Cool\",\"Taut\",\"Tense\",\"Cozy\",\"Homey\",\"Pastoral\",\n \"Sylvan\",\"Bucolic\",\"Idyllic\",\"Quaint\",\"Charming\",\"Lovely\",\"Pretty\",\"Dapper\",\n \"Natty\",\"Chic\",\"Posh\",\"Classy\",\"Fancy\",\"Ornate\",\"Lavish\",\"Opulent\",\n \"Majestic\",\"Dignified\",\"August\",\"Solemn\",\"Sober\",\"Heartfelt\",\"Genuine\",\"Authentic\",\n \"Novel\",\"Singular\",\"Distinct\",\"Chosen\",\"Select\",\"Premium\",\"Deluxe\",\"Superior\",\n \"Exquisite\",\"Superb\",\"Splendid\",\"Glorious\",\"Sublime\",\"Resonant\",\"Harmonic\",\"Melodic\",\n \"Lyrical\",\"Poetic\",\"Seamless\",\"Effortless\",\"Organic\",\"Primal\",\"Devoted\",\"Dedicated\",\n \"Committed\",\"Focused\",\"Determined\",\"Resolute\",\"Steadfast\",\"Unwavering\",\"Constant\",\"Faithful\",\n \"Reliable\",\"Dependable\",\"Trusty\",\"Anchored\",\"Moored\",\"Sheltered\",\"Protected\",\"Guarded\",\n \"Shielded\",\"Fortified\",\"Reinforced\",\"Braced\",\"Bolstered\",\"Supported\",\"Upheld\",\"Sustained\",\n \"Preserved\",\"Conserved\",\"Stored\",\"Vaulted\",\"Locked\",\"Secured\",\"Fastened\",\"Linked\",\n \"Joined\",\"Connected\",\"Paired\",\"Matched\",\"Balanced\",\"Aligned\",\"Centered\",\"Aimed\",\n \"Directed\",\"Guided\",\"Steered\",\"Piloted\",\"Navigated\",\"Charted\",\"Mapped\",\"Tracked\",\n \"Pursued\",\"Discovered\",\"Unveiled\",\"Displayed\",\"Presented\",\"Granted\",\"Bestowed\",\"Conferred\",\n \"Sapient\",\"Sentient\",\"Radiant\",\"Fertile\",\"Abundant\",\"Bountiful\",\"Plentiful\",\"Prolific\",\n \"Thriving\",\"Flourishing\",\"Blooming\",\"Budding\",\"Growing\",\"Expanding\",\"Advancing\",\"Progressing\",\n \"Evolving\",\"Maturing\",\"Ripening\",\"Developing\",\"Emerging\",\"Nascent\",\"Incipient\",\"Dawning\",\n \"Unfolding\",\"Awakening\",\"Stirring\",\"Kindling\",\"Igniting\",\"Sparking\",\"Triggering\",\"Launching\",\n \"Initiating\",\"Pioneering\",\"Trailblazing\",\"Groundbreaking\",\"Innovative\",\"Inventive\",\"Creative\",\"Imaginative\",\n \"Inspired\",\"Visionary\",\"Prophetic\",\"Prescient\",\"Insightful\",\"Perceptive\",\"Observant\",\"Watchful\",\n \"Vigilant\",\"Attentive\",\"Thoughtful\",\"Considerate\",\"Caring\",\"Nurturing\",\"Fostering\",\"Cultivating\",\n \"Tending\",\"Pruning\",\"Trimming\",\"Shaping\",\"Forming\",\"Molding\",\"Fashioning\",\"Designing\",\n \"Drafting\",\"Sketching\",\"Drawing\",\"Painting\",\"Coloring\",\"Tinting\",\"Shading\",\"Blending\",\n \"Mixing\",\"Merging\",\"Combining\",\"Uniting\",\"Fusing\",\"Melding\",\"Weaving\",\"Knitting\",\n \"Stitching\",\"Sewing\",\"Quilting\",\"Patching\",\"Mending\",\"Healing\",\"Restoring\",\"Renewing\",\n \"Reviving\",\"Refreshing\",\"Rejuvenating\",\"Invigorating\",\"Energizing\",\"Empowering\",\"Strengthening\",\"Fortifying\",\n \"Hardening\",\"Tempering\",\"Seasoning\",\"Curing\",\"Aging\",\"Mellowing\",\"Softening\",\"Smoothing\",\n \"Leveling\",\"Planing\",\"Sanding\",\"Buffing\",\"Burnishing\",\"Radiating\",\"Beaming\",\"Lighting\",\n \"Illuminating\",\"Brightening\",\"Clarifying\",\"Purifying\",\"Filtering\",\"Distilling\",\"Condensing\",\"Concentrating\",\n \"Focusing\",\"Directing\",\"Channeling\",\"Terraced\",\"Ascending\",\"Streaming\",\"Umber\",\"Careful\",\n \"Perfecting\",\"Glittering\",\"Twinkling\",\"Verdure\",\"Auroral\",\"Boreal\",\"Austral\",\"Temperate\",\n]);\n\n// ─── Nouns (1000) ───────────────────────────────────────────────\nexport const NOUNS: readonly string[] = Object.freeze([\n \"Falcon\",\"Hawk\",\"Eagle\",\"Owl\",\"Heron\",\"Crane\",\"Swan\",\"Dove\",\n \"Raven\",\"Finch\",\"Robin\",\"Wren\",\"Lark\",\"Jay\",\"Ibis\",\"Kite\",\n \"Osprey\",\"Condor\",\"Pelican\",\"Stork\",\"Sparrow\",\"Tern\",\"Puffin\",\"Parrot\",\n \"Toucan\",\"Kingfisher\",\"Flamingo\",\"Quail\",\"Pheasant\",\"Grouse\",\"Oriole\",\"Warbler\",\n \"Thrush\",\"Starling\",\"Magpie\",\"Swallow\",\"Martin\",\"Plover\",\"Curlew\",\"Sandpiper\",\n \"Wolf\",\"Fox\",\"Bear\",\"Stag\",\"Elk\",\"Moose\",\"Bison\",\"Lynx\",\n \"Cougar\",\"Panther\",\"Jaguar\",\"Leopard\",\"Tiger\",\"Lion\",\"Cheetah\",\"Gazelle\",\n \"Antelope\",\"Impala\",\"Zebra\",\"Giraffe\",\"Rhino\",\"Hippo\",\"Otter\",\"Beaver\",\n \"Badger\",\"Marten\",\"Ferret\",\"Mink\",\"Hare\",\"Rabbit\",\"Squirrel\",\"Chipmunk\",\n \"Porcupine\",\"Hedgehog\",\"Armadillo\",\"Pangolin\",\"Lemur\",\"Gibbon\",\"Tamarin\",\"Capybara\",\n \"Chinchilla\",\"Ocelot\",\"Margay\",\"Coati\",\"Kinkajou\",\"Tapir\",\"Okapi\",\"Kudu\",\n \"Oryx\",\"Chamois\",\"Orca\",\"Dolphin\",\"Whale\",\"Narwhal\",\"Walrus\",\"Seal\",\n \"Manatee\",\"Turtle\",\"Iguana\",\"Gecko\",\"Chameleon\",\"Newt\",\"Salamander\",\"Crab\",\n \"Lobster\",\"Seahorse\",\"Starfish\",\"Octopus\",\"Squid\",\"Jellyfish\",\"Stingray\",\"Barracuda\",\n \"Marlin\",\"Sailfish\",\"Trout\",\"Salmon\",\"Mantis\",\"Cricket\",\"Firefly\",\"Dragonfly\",\n \"Cedar\",\"Oak\",\"Pine\",\"Birch\",\"Maple\",\"Elm\",\"Ash\",\"Willow\",\n \"Cypress\",\"Redwood\",\"Sequoia\",\"Spruce\",\"Fir\",\"Larch\",\"Yew\",\"Beech\",\n \"Alder\",\"Poplar\",\"Aspen\",\"Walnut\",\"Hickory\",\"Teak\",\"Mahogany\",\"Ebony\",\n \"Bamboo\",\"Palm\",\"Acacia\",\"Baobab\",\"Banyan\",\"Olive\",\"Laurel\",\"Magnolia\",\n \"Lotus\",\"Orchid\",\"Iris\",\"Lily\",\"Rose\",\"Tulip\",\"Daisy\",\"Aster\",\n \"Dahlia\",\"Peony\",\"Jasmine\",\"Violet\",\"Clover\",\"Fern\",\"Moss\",\"Lichen\",\n \"Ivy\",\"Vine\",\"Reed\",\"Sage\",\"Basil\",\"Thyme\",\"Mint\",\"Dill\",\n \"Fennel\",\"Sorrel\",\"Yarrow\",\"Thistle\",\"Heather\",\"Bluebell\",\"Primrose\",\"Marigold\",\n \"Sunflower\",\"Zinnia\",\"Pansy\",\"Poppy\",\"Crocus\",\"Snowdrop\",\"Foxglove\",\"Honeysuckle\",\n \"Wisteria\",\"Hibiscus\",\"Plumeria\",\"Gardenia\",\"Camellia\",\"Begonia\",\"Azalea\",\"Oleander\",\n \"Canyon\",\"Ridge\",\"Peak\",\"Summit\",\"Cliff\",\"Bluff\",\"Mesa\",\"Butte\",\n \"Plateau\",\"Terrace\",\"Valley\",\"Basin\",\"Gorge\",\"Ravine\",\"Gulch\",\"Fjord\",\n \"Inlet\",\"Bay\",\"Cove\",\"Harbor\",\"Lagoon\",\"Reef\",\"Atoll\",\"Isle\",\n \"Peninsula\",\"Cape\",\"Shoal\",\"Bank\",\"Ledge\",\"Shelf\",\"Dune\",\"Desert\",\n \"Steppe\",\"Tundra\",\"Glacier\",\"Moraine\",\"Geyser\",\"Oasis\",\"Delta\",\"Estuary\",\n \"Marsh\",\"Bog\",\"Swamp\",\"Fen\",\"Moor\",\"Heath\",\"Meadow\",\"Prairie\",\n \"Savanna\",\"Glen\",\"Dale\",\"Dell\",\"Vale\",\"Hollow\",\"Grove\",\"Copse\",\n \"Thicket\",\"Taiga\",\"Mangrove\",\"Wetland\",\"Cascade\",\"Brook\",\"Creek\",\"Stream\",\n \"River\",\"Lake\",\"Pond\",\"Pool\",\"Tarn\",\"Loch\",\"Falls\",\"Fountain\",\n \"Grotto\",\"Cavern\",\"Cave\",\"Tunnel\",\"Arch\",\"Bridge\",\"Ford\",\"Pass\",\n \"Trail\",\"Path\",\"Route\",\"Caldera\",\"Crater\",\"Vent\",\"Spire\",\"Needle\",\n \"Dome\",\"Gateway\",\"Portal\",\"Threshold\",\"Verge\",\"Brink\",\"Edge\",\"Rim\",\n \"Brow\",\"Crest\",\"Promontory\",\"Headland\",\"Spit\",\"Tombolo\",\"Isthmus\",\"Strait\",\n \"Narrows\",\"Sound\",\"Bight\",\"Reach\",\"Stretch\",\"Expanse\",\"Clearing\",\"Glade\",\n \"Knoll\",\"Hillock\",\"Mound\",\"Tor\",\"Crag\",\"Scarp\",\"Escarpment\",\"Comet\",\n \"Meteor\",\"Asteroid\",\"Nebula\",\"Galaxy\",\"Quasar\",\"Pulsar\",\"Star\",\"Sun\",\n \"Moon\",\"Planet\",\"Orbit\",\"Eclipse\",\"Corona\",\"Flare\",\"Nova\",\"Cosmos\",\n \"Void\",\"Abyss\",\"Ether\",\"Zenith\",\"Nadir\",\"Horizon\",\"Aurora\",\"Meridian\",\n \"Equinox\",\"Solstice\",\"Phase\",\"Cycle\",\"Epoch\",\"Eon\",\"Era\",\"Dawn\",\n \"Dusk\",\"Twilight\",\"Night\",\"Noon\",\"Morning\",\"Evening\",\"Sunset\",\"Sunrise\",\n \"Daybreak\",\"Nightfall\",\"Starlight\",\"Moonbeam\",\"Sunray\",\"Skyline\",\"Firmament\",\"Canopy\",\n \"Infinity\",\"Vega\",\"Rigel\",\"Altair\",\"Deneb\",\"Sirius\",\"Polaris\",\"Arcturus\",\n \"Antares\",\"Lyra\",\"Orion\",\"Draco\",\"Phoenix\",\"Hydra\",\"Corvus\",\"Cygnus\",\n \"Aquila\",\"Andromeda\",\"Pegasus\",\"Perseus\",\"Gemini\",\"Centauri\",\"Cassiopeia\",\"Scorpius\",\n \"Sagittarius\",\"Capella\",\"Procyon\",\"Aldebaran\",\"Betelgeuse\",\"Spica\",\"Prism\",\"Quill\",\n \"Forge\",\"Anvil\",\"Helm\",\"Rune\",\"Atlas\",\"Compass\",\"Anchor\",\"Beacon\",\n \"Bell\",\"Bugle\",\"Drum\",\"Flute\",\"Harp\",\"Horn\",\"Lyre\",\"Pipe\",\n \"Gong\",\"Chime\",\"Cymbal\",\"Fiddle\",\"Trumpet\",\"Viola\",\"Cello\",\"Oboe\",\n \"Lute\",\"Mandolin\",\"Zither\",\"Sitar\",\"Banjo\",\"Lantern\",\"Torch\",\"Candle\",\n \"Lamp\",\"Globe\",\"Lens\",\"Scope\",\"Mirror\",\"Frame\",\"Easel\",\"Palette\",\n \"Brush\",\"Chisel\",\"Mallet\",\"Hammer\",\"Tongs\",\"Ladle\",\"Kettle\",\"Crucible\",\n \"Mortar\",\"Pestle\",\"Flask\",\"Vial\",\"Beaker\",\"Alembic\",\"Furnace\",\"Kiln\",\n \"Loom\",\"Shuttle\",\"Bobbin\",\"Spool\",\"Thimble\",\"Pin\",\"Clasp\",\"Buckle\",\n \"Brooch\",\"Pendant\",\"Amulet\",\"Talisman\",\"Charm\",\"Token\",\"Coin\",\"Medal\",\n \"Badge\",\"Shield\",\"Banner\",\"Flag\",\"Pennant\",\"Sigil\",\"Stamp\",\"Emblem\",\n \"Totem\",\"Icon\",\"Statue\",\"Obelisk\",\"Monolith\",\"Cairn\",\"Tablet\",\"Scroll\",\n \"Tome\",\"Codex\",\"Ledger\",\"Journal\",\"Chronicle\",\"Almanac\",\"Manual\",\"Gazette\",\n \"Folio\",\"Pamphlet\",\"Broadsheet\",\"Parchment\",\"Vellum\",\"Papyrus\",\"Inkwell\",\"Quiver\",\n \"Satchel\",\"Pouch\",\"Casket\",\"Coffer\",\"Chest\",\"Crate\",\"Barrel\",\"Quartz\",\n \"Opal\",\"Onyx\",\"Agate\",\"Garnet\",\"Topaz\",\"Beryl\",\"Zircon\",\"Spinel\",\n \"Peridot\",\"Jasper\",\"Amethyst\",\"Citrine\",\"Tourmaline\",\"Malachite\",\"Azurite\",\"Lapis\",\n \"Pyrite\",\"Galena\",\"Mica\",\"Talc\",\"Gypsum\",\"Calcite\",\"Dolomite\",\"Basalt\",\n \"Granite\",\"Marble\",\"Slate\",\"Shale\",\"Sandstone\",\"Limestone\",\"Obsidian\",\"Pumice\",\n \"Tuff\",\"Chert\",\"Flint\",\"Chalcedony\",\"Carnelian\",\"Sardonyx\",\"Moonstone\",\"Sunstone\",\n \"Labradorite\",\"Tanzanite\",\"Kunzite\",\"Rhodonite\",\"Sodalite\",\"Chrysocolla\",\"Aventurine\",\"Fluorite\",\n \"Seraphinite\",\"Charoite\",\"Sugilite\",\"Larimar\",\"Prehnite\",\"Danburite\",\"Scolecite\",\"Celestite\",\n \"Amazonite\",\"Howlite\",\"Lepidolite\",\"Storm\",\"Thunder\",\"Lightning\",\"Breeze\",\"Gale\",\n \"Squall\",\"Typhoon\",\"Cyclone\",\"Monsoon\",\"Tempest\",\"Zephyr\",\"Chinook\",\"Mistral\",\n \"Sirocco\",\"Foehn\",\"Bora\",\"Rain\",\"Drizzle\",\"Shower\",\"Downpour\",\"Deluge\",\n \"Flood\",\"Torrent\",\"Current\",\"Tide\",\"Wave\",\"Swell\",\"Surf\",\"Spray\",\n \"Foam\",\"Mist\",\"Fog\",\"Haze\",\"Dew\",\"Frost\",\"Ice\",\"Snow\",\n \"Sleet\",\"Hail\",\"Rime\",\"Thaw\",\"Flow\",\"Drift\",\"Eddy\",\"Vortex\",\n \"Whirl\",\"Spiral\",\"Funnel\",\"Column\",\"Plume\",\"Wisp\",\"Streak\",\"Band\",\n \"Front\",\"Trough\",\"Rainbow\",\"Halo\",\"Mirage\",\"Shimmer\",\"Glimmer\",\"Tower\",\n \"Turret\",\"Bastion\",\"Citadel\",\"Fortress\",\"Castle\",\"Palace\",\"Manor\",\"Lodge\",\n \"Cabin\",\"Cottage\",\"Villa\",\"Ranch\",\"Barn\",\"Silo\",\"Mill\",\"Foundry\",\n \"Workshop\",\"Studio\",\"Gallery\",\"Museum\",\"Library\",\"Archive\",\"Treasury\",\"Vault\",\n \"Chamber\",\"Hall\",\"Court\",\"Plaza\",\"Garden\",\"Balcony\",\"Porch\",\"Arcade\",\n \"Colonnade\",\"Pergola\",\"Pavilion\",\"Gazebo\",\"Kiosk\",\"Chapel\",\"Temple\",\"Shrine\",\n \"Monastery\",\"Abbey\",\"Cathedral\",\"Basilica\",\"Minaret\",\"Pagoda\",\"Stupa\",\"Pyramid\",\n \"Arena\",\"Stadium\",\"Forum\",\"Market\",\"Bazaar\",\"Emporium\",\"Depot\",\"Station\",\n \"Terminal\",\"Dock\",\"Wharf\",\"Pier\",\"Jetty\",\"Quay\",\"Marina\",\"Lighthouse\",\n \"Watchtower\",\"Outpost\",\"Camp\",\"Shelter\",\"Refuge\",\"Sanctuary\",\"Haven\",\"Retreat\",\n \"Nest\",\"Aerie\",\"Burrow\",\"Den\",\"Lair\",\"Roost\",\"Perch\",\"Bower\",\n \"Arbor\",\"Alcove\",\"Sextant\",\"Astrolabe\",\"Sundial\",\"Hourglass\",\"Pendulum\",\"Gyroscope\",\n \"Turbine\",\"Dynamo\",\"Generator\",\"Piston\",\"Valve\",\"Lever\",\"Pulley\",\"Winch\",\n \"Derrick\",\"Gantry\",\"Scaffold\",\"Trellis\",\"Lattice\",\"Grid\",\"Net\",\"Web\",\n \"Axle\",\"Gear\",\"Cog\",\"Sprocket\",\"Chain\",\"Link\",\"Cable\",\"Wire\",\n \"Thread\",\"Cord\",\"Rope\",\"Rigging\",\"Mast\",\"Boom\",\"Spar\",\"Keel\",\n \"Hull\",\"Rudder\",\"Tiller\",\"Wheel\",\"Chart\",\"Map\",\"Gauge\",\"Meter\",\n \"Scale\",\"Caliper\",\"Ruler\",\"Level\",\"Plumb\",\"Protractor\",\"Template\",\"Stencil\",\n \"Mold\",\"Die\",\"Lathe\",\"Bellows\",\"Retort\",\"Condenser\",\"Centrifuge\",\"Spectrometer\",\n \"Oscilloscope\",\"Theodolite\",\"Transit\",\"Sounding\",\"Probe\",\"Sensor\",\"Relay\",\"Switch\",\n \"Circuit\",\"Diode\",\"Quest\",\"Saga\",\"Legend\",\"Myth\",\"Fable\",\"Ballad\",\n \"Anthem\",\"Hymn\",\"Ode\",\"Sonnet\",\"Verse\",\"Stanza\",\"Canto\",\"Chorus\",\n \"Refrain\",\"Motif\",\"Theme\",\"Arc\",\"Prologue\",\"Epilogue\",\"Prelude\",\"Overture\",\n \"Finale\",\"Crescendo\",\"Cadence\",\"Tempo\",\"Rhythm\",\"Pulse\",\"Beat\",\"Tone\",\n \"Note\",\"Chord\",\"Harmony\",\"Melody\",\"Lyric\",\"Opus\",\"Suite\",\"Etude\",\n \"Fugue\",\"Canon\",\"March\",\"Waltz\",\"Rondo\",\"Aria\",\"Duet\",\"Trio\",\n \"Quartet\",\"Ensemble\",\"Guild\",\"League\",\"Order\",\"Council\",\"Assembly\",\"Conclave\",\n \"Synod\",\"Quorum\",\"Cohort\",\"Legion\",\"Brigade\",\"Battalion\",\"Regiment\",\"Division\",\n \"Corps\",\"Fleet\",\"Squadron\",\"Patrol\",\"Convoy\",\"Caravan\",\"Expedition\",\"Voyage\",\n \"Journey\",\"Trek\",\"Odyssey\",\"Passage\",\"Crossing\",\"Venture\",\"Enterprise\",\"Mission\",\n \"Campaign\",\"Crusade\",\"Pilgrimage\",\"Safari\",\"Sortie\",\"Foray\",\"Rally\",\"Charge\",\n \"Advance\",\"Concord\",\"Ember\",\"Blaze\",\"Inferno\",\"Pyre\",\"Spark\",\"Cinder\",\n \"Smoke\",\"Vapor\",\"Steam\",\"Nimbus\",\"Cumulus\",\"Cirrus\",\"Stratus\",\"Billow\",\n \"Puff\",\"Wake\",\"Ripple\",\"Surge\",\"Ebb\",\"Flux\",\"Gush\",\"Rush\",\n \"Spring\",\"Well\",\"Font\",\"Source\",\"Origin\",\"Root\",\"Seed\",\"Sprout\",\n \"Bud\",\"Bloom\",\"Petal\",\"Leaf\",\"Branch\",\"Limb\",\"Trunk\",\"Bark\",\n \"Grain\",\"Fiber\",\"Pulp\",\"Core\",\"Sap\",\"Resin\",\"Nectar\",\"Pollen\",\n \"Spore\",\"Frond\",\"Tendril\",\"Runner\",\"Shoot\",\"Stalk\",\"Stem\",\"Thorn\",\n \"Burr\",\"Cone\",\"Acorn\",\"Pinecone\",\"Nutshell\",\"Keystone\",\"Capstone\",\"Milestone\",\n \"Cornerstone\",\"Foundation\",\"Bedrock\",\"Pillar\",\"Buttress\",\"Parapet\",\"Battlement\",\"Barbican\",\n \"Gatehouse\",\"Drawbridge\",\"Portcullis\",\"Moat\",\"Stockade\",\"Palisade\",\"Bulwark\",\"Levee\",\n \"Embankment\",\"Causeway\",\"Aqueduct\",\"Viaduct\",\"Trestle\",\"Span\",\"Lintel\",\"Plinth\",\n \"Pedestal\",\"Dais\",\"Rostrum\",\"Podium\",\"Stage\",\"Platform\",\"Deck\",\"Landing\",\n \"Berth\",\"Channel\",\"Lock\",\"Weir\",\"Dam\",\"Spillway\",\"Flume\",\"Chute\",\n \"Sluice\",\"Nozzle\",\"Spout\",\"Faucet\",\"Cistern\",\"Wellspring\",\"Headwater\",\"Watershed\",\n \"Alluvium\",\"Loam\",\"Humus\",\"Peat\",\"Marl\",\"Silt\",\"Writ\",\"Clamp\",\n \"Eyepiece\",\"Traverse\",\"Stride\",\"Parley\",\"Char\",\"Trace\",\"Confluence\",\"Rampart\",\n]);\n\n// ─── Blocked Combinations ──────────────────────────────────────\n// Adjective+Noun pairs that form offensive or inappropriate words\n// when concatenated. Checked at derivation time; PRNG advances\n// deterministically to produce a clean replacement.\nexport const BLOCKED_COMBOS: ReadonlySet<string> = Object.freeze(\n new Set<string>([\n // Add any discovered offensive adj+noun combinations here.\n // Format: \"AdjectiveNoun\" (PascalCase, concatenated)\n ]),\n);\n","// ═══════════════════════════════════════════════════════════════\n// SolNames v1 — Name Derivation Engine\n// SHA-256(\"solnames-v1:\" + wallet) → PRNG → adjective + noun\n// ═══════════════════════════════════════════════════════════════\n\nimport { sha256, sha256Hex } from \"./sha256\";\nimport { ADJECTIVES, NOUNS, BLOCKED_COMBOS, SOLNAMES_VERSION } from \"./constants\";\nimport type { NameFormat, SolNameIdentity } from \"./constants\";\n\nfunction mulberry32(seed: number): () => number {\n let a = seed | 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nconst DOMAIN = `solnames-${SOLNAMES_VERSION}:`;\n\n/** Options for customizing name derivation. */\nexport interface DeriveOptions {\n /** Custom adjective word list (default: built-in 1000 adjectives) */\n adjectives?: readonly string[];\n /** Custom noun word list (default: built-in 1000 nouns) */\n nouns?: readonly string[];\n /** Custom blocked adjective+noun combinations (default: built-in set) */\n blockedCombos?: Set<string>;\n /** Custom domain prefix for SHA-256 hashing (default: \"solnames-v1\") */\n domain?: string;\n}\n\n/**\n * Derive a deterministic name from a Solana wallet address.\n *\n * @param wallet Base58 wallet address\n * @param format Name format (default: \"display\")\n * @param options Custom word lists, domain, or blocked combos\n * @returns Formatted name string\n */\nexport function deriveName(\n wallet: string,\n format: NameFormat = \"display\",\n options?: DeriveOptions,\n): string {\n const id = deriveIdentity(wallet, options);\n switch (format) {\n case \"short\":\n return id.short;\n case \"display\":\n return id.name;\n case \"tag\":\n return id.tag;\n case \"full\":\n return id.full;\n }\n}\n\n/**\n * Derive the full identity bundle for a wallet address.\n * Returns all four name formats plus component parts.\n */\nexport function deriveIdentity(\n wallet: string,\n options?: DeriveOptions,\n): SolNameIdentity {\n const adjectives = options?.adjectives ?? ADJECTIVES;\n const nouns = options?.nouns ?? NOUNS;\n const blocked = options?.blockedCombos ?? BLOCKED_COMBOS;\n const domain = options?.domain ? `${options.domain}:` : DOMAIN;\n\n const hash = sha256(domain + wallet);\n const hex = sha256Hex(domain + wallet);\n\n // Seed PRNG from first 4 bytes (big-endian)\n const seed =\n ((hash[0] << 24) | (hash[1] << 16) | (hash[2] << 8) | hash[3]) >>> 0;\n const rng = mulberry32(seed);\n\n // Pick first adj+noun pair, retrying if blocked\n let adj1 = adjectives[Math.floor(rng() * adjectives.length)];\n let noun1 = nouns[Math.floor(rng() * nouns.length)];\n while (blocked.has(adj1 + noun1)) {\n adj1 = adjectives[Math.floor(rng() * adjectives.length)];\n noun1 = nouns[Math.floor(rng() * nouns.length)];\n }\n\n // Pick second adj+noun pair for full format\n const adj2 = adjectives[Math.floor(rng() * adjectives.length)];\n const noun2 = nouns[Math.floor(rng() * nouns.length)];\n\n // Discriminator from bytes 8-9 (4 hex chars)\n const discriminator = hex.slice(16, 20);\n\n return {\n short: adj1,\n name: adj1 + noun1,\n tag: adj1 + noun1 + \"#\" + discriminator,\n full: adj1 + noun1 + \"-\" + adj2 + noun2,\n adjective: adj1,\n noun: noun1,\n hash: hex,\n discriminator,\n };\n}\n","// ═══════════════════════════════════════════════════════════════\n// Color math utilities for SolFaces v2\n// Shared by renderer.ts (string) and SolFace.tsx (React)\n// ═══════════════════════════════════════════════════════════════\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n \"#\" +\n [r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\")\n )\n .join(\"\")\n );\n}\n\nexport function darken(hex: string, pct = 0.12): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * (1 - pct), g * (1 - pct), b * (1 - pct));\n}\n\nexport function lighten(hex: string, pct = 0.15): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r + (255 - r) * pct, g + (255 - g) * pct, b + (255 - b) * pct);\n}\n\nexport function blend(a: string, b: string, t = 0.5): string {\n const [r1, g1, b1] = hexToRgb(a);\n const [r2, g2, b2] = hexToRgb(b);\n return rgbToHex(\n r1 + (r2 - r1) * t,\n g1 + (g2 - g1) * t,\n b1 + (b2 - b1) * t\n );\n}\n\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n return (r + g + b) / 3;\n}\n\nexport interface DerivedColors {\n skinHi: string;\n skinLo: string;\n skinMid: string;\n isDark: boolean;\n cheekColor: string;\n cheekOpacity: number;\n lipColor: string;\n noseFill: string;\n browColor: string;\n earFill: string;\n earShadow: string;\n eyeWhiteAdapted: string;\n lidColor: string;\n accessoryColor: string;\n}\n\nexport function deriveSkinColors(skin: string): DerivedColors {\n const sL = luminance(skin);\n const isDark = sL < 100;\n\n const skinHi = lighten(skin, 0.10);\n const skinLo = darken(skin, 0.22);\n const skinMid = darken(skin, 0.05);\n\n // Cheek: warm blush relative to skin\n const [sr, sg, sb] = hexToRgb(skin);\n let cheekColor: string;\n if (sL > 120) {\n const rB = sL > 180 ? 0.03 : 0.06;\n const gD = sL > 180 ? 0.30 : 0.28;\n const bD = sL > 180 ? 0.25 : 0.22;\n cheekColor = rgbToHex(\n Math.min(255, sr + sr * rB),\n Math.max(0, sg - sg * gD),\n Math.max(0, sb - sb * bD)\n );\n } else {\n cheekColor = rgbToHex(\n Math.min(255, sr + 50),\n Math.max(0, sg - 10),\n Math.max(0, sb - 5)\n );\n }\n const cheekOpacity = 0.15 + 0.18 * (1 - Math.min(1, sL / 240));\n\n // Lips: smooth skin-relative gradient\n const lipT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const lipBase = blend(\"#D89090\", \"#A83848\", lipT);\n const midBoost = 1 - Math.abs(sL - 140) / 80;\n const lipBlend = (isDark ? 0.70 : 0.62) + Math.max(0, midBoost) * 0.12;\n const lipRaw = blend(skin, lipBase, Math.min(0.82, lipBlend));\n const [lr, lg, lb] = hexToRgb(lipRaw);\n const lipD = Math.abs(sr - lr) + Math.abs(sg - lg) + Math.abs(sb - lb);\n const lipColor = lipD < 60 ? blend(skin, lipBase, 0.78) : lipRaw;\n\n // Features\n const browColor = isDark ? lighten(skin, sL < 80 ? 0.35 : 0.25) : darken(skin, 0.55);\n const noseFill = isDark ? lighten(skin, 0.20) : darken(skin, 0.20);\n const earT = Math.max(0, Math.min(1, (sL - 100) / 60));\n const earFill = blend(lighten(skin, 0.08), skinMid, earT);\n const earShadow = darken(skin, 0.10 + 0.06 * (1 - Math.min(1, sL / 160)));\n const lidColor = isDark ? lighten(skin, 0.18) : darken(skin, 0.15);\n\n // Eye white: adapted to skin luminance\n const ewT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const eyeWhiteAdapted = blend(\"#EDE8E0\", \"#FBF8F2\", ewT);\n\n // Accessory color: skin-warm neutral\n const warmth = sL > 140 ? 0.3 : sL > 100 ? 0.5 : 0.7;\n const accessoryColor = blend(\"#808890\", blend(skin, \"#B0A898\", 0.3), warmth);\n\n return {\n skinHi, skinLo, skinMid, isDark,\n cheekColor, cheekOpacity,\n lipColor, noseFill, browColor,\n earFill, earShadow,\n eyeWhiteAdapted, lidColor,\n accessoryColor,\n };\n}\n\n/** Compute buzz cut opacity — higher when hair/skin contrast is low */\nexport function buzzOpacity(hairCol: string, skin: string): number {\n const [hr, hg, hb] = hexToRgb(hairCol);\n const [sr, sg, sb] = hexToRgb(skin);\n return Math.abs(hr - sr) + Math.abs(hg - sg) + Math.abs(hb - sb) < 80\n ? 0.70\n : 0.50;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — SVG String Renderer\n// Gradient-rich, skin-luminance-driven avatar rendering.\n// Generates SVG markup as strings for server-side and non-React use.\n// ═══════════════════════════════════════════════════════════════\n\nimport {\n generateTraits,\n effectiveAccessory,\n SKIN_COLORS,\n EYE_COLORS,\n HAIR_COLORS,\n BG_COLORS,\n type RenderOptions,\n} from \"./traits\";\nimport { deriveSkinColors, darken, lighten, blend, buzzOpacity } from \"./colors\";\n\nexport type { RenderOptions } from \"./traits\";\n\n// ─── Helpers ────────────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── Gradient Defs ──────────────────────────────\n\nfunction buildDefs(\n id: string,\n skin: string,\n skinHi: string,\n skinLo: string,\n hairCol: string,\n bgCol: string,\n cheekColor: string,\n cheekOpacity: number,\n flat: boolean,\n full: boolean,\n glowIntensity: number,\n): string {\n if (flat) return \"\";\n\n let d = \"<defs>\";\n\n // Skin gradient (top → bottom)\n d += `<linearGradient id=\"${id}sg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinHi}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\"/>`;\n d += `</linearGradient>`;\n\n // Hair gradient\n d += `<linearGradient id=\"${id}hg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${lighten(hairCol, 0.15)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${darken(hairCol, 0.15)}\"/>`;\n d += `</linearGradient>`;\n\n // BG gradient\n d += `<linearGradient id=\"${id}bg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${lighten(bgCol, 0.12)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${darken(bgCol, 0.12)}\"/>`;\n d += `</linearGradient>`;\n\n if (full) {\n // Glow (radial, top center)\n d += `<radialGradient id=\"${id}glow\" cx=\"0.5\" cy=\"0.28\" r=\"0.45\">`;\n d += `<stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"${glowIntensity}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Chin shadow\n d += `<radialGradient id=\"${id}chin\" cx=\"0.5\" cy=\"0.85\" r=\"0.35\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinLo}\" stop-opacity=\"0.30\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek L\n d += `<radialGradient id=\"${id}cL\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek R\n d += `<radialGradient id=\"${id}cR\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n }\n\n d += \"</defs>\";\n return d;\n}\n\n// ─── Hair Back (behind face) ────────────────────\n\nfunction renderHairBack(hi: number, id: string, flat: boolean): string {\n const fill = flat ? \"currentColor\" : `url(#${id}hg)`;\n switch (hi) {\n case 5: // Long\n return `<g fill=\"${fill}\"><rect x=\"10\" y=\"14\" width=\"44\" height=\"42\" rx=\"6\"/></g>`;\n case 6: // Bob\n return `<g fill=\"${fill}\"><rect x=\"12\" y=\"14\" width=\"40\" height=\"32\" rx=\"8\"/></g>`;\n case 8: // Wavy\n return `<g fill=\"${fill}\"><rect x=\"11\" y=\"14\" width=\"42\" height=\"38\" rx=\"8\"/></g>`;\n default:\n return \"\";\n }\n}\n\n// ─── Ears ───────────────────────────────────────\n\nfunction renderEars(earFill: string, earShadow: string): string {\n return (\n `<ellipse cx=\"11\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"11\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>`\n );\n}\n\n// ─── Face ───────────────────────────────────────\n\nfunction renderFace(id: string, skin: string, flat: boolean, opacity: number = 1): string {\n const fill = flat ? skin : `url(#${id}sg)`;\n const opAttr = opacity < 1 ? ` opacity=\"${opacity}\"` : \"\";\n return `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"${fill}\"${opAttr}/>`;\n}\n\n// ─── Face Overlays (full detail) ────────────────\n\nfunction renderFaceOverlays(id: string, flat: boolean): string {\n if (flat) return \"\";\n return (\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}glow)\"/>` +\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}chin)\"/>` +\n `<ellipse cx=\"22\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cL)\"/>` +\n `<ellipse cx=\"42\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cR)\"/>` +\n `<line x1=\"20\" y1=\"50\" x2=\"44\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"0.3\" opacity=\"0.08\" stroke-linecap=\"round\"/>`\n );\n}\n\n// ─── Hair Front ─────────────────────────────────\n\nfunction renderHairFront(hi: number, id: string, hairCol: string, skin: string, flat: boolean): string {\n const fill = flat ? hairCol : `url(#${id}hg)`;\n switch (hi) {\n case 0: return \"\"; // Bald\n case 1: // Short\n return `<path d=\"M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z\" fill=\"${fill}\"/>`;\n case 2: // Curly\n return (\n `<g fill=\"${fill}\">` +\n `<circle cx=\"20\" cy=\"14\" r=\"5\"/>` +\n `<circle cx=\"28\" cy=\"11\" r=\"5.5\"/>` +\n `<circle cx=\"36\" cy=\"11\" r=\"5.5\"/>` +\n `<circle cx=\"44\" cy=\"14\" r=\"5\"/>` +\n `<circle cx=\"16\" cy=\"20\" r=\"4\"/>` +\n `<circle cx=\"48\" cy=\"20\" r=\"4\"/>` +\n `</g>`\n );\n case 3: // Side sweep\n return (\n `<path d=\"M14 26 Q14 12 32 10 Q50 12 50 26 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<path d=\"M14 20 Q8 16 10 8 Q14 10 20 16 Z\" fill=\"${fill}\"/>`\n );\n case 4: // Puff\n return `<ellipse cx=\"32\" cy=\"10\" rx=\"14\" ry=\"8\" fill=\"${fill}\"/>`;\n case 5: // Long\n return `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>`;\n case 6: // Bob\n return (\n `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<rect x=\"10\" y=\"28\" width=\"8\" height=\"14\" rx=\"4\" fill=\"${fill}\"/>` +\n `<rect x=\"46\" y=\"28\" width=\"8\" height=\"14\" rx=\"4\" fill=\"${fill}\"/>`\n );\n case 7: { // Buzz\n const bOp = buzzOpacity(hairCol, skin);\n return `<rect x=\"15\" y=\"13\" width=\"34\" height=\"16\" rx=\"10\" ry=\"8\" fill=\"${hairCol}\" opacity=\"${bOp.toFixed(2)}\"/>`;\n }\n case 8: // Wavy\n return (\n `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<path d=\"M12 30 Q10 20 14 16\" fill=\"none\" stroke=\"${fill}\" stroke-width=\"4\" stroke-linecap=\"round\"/>` +\n `<path d=\"M52 30 Q54 20 50 16\" fill=\"none\" stroke=\"${fill}\" stroke-width=\"4\" stroke-linecap=\"round\"/>`\n );\n case 9: // Topknot\n return (\n `<path d=\"M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z\" fill=\"${fill}\"/>` +\n `<ellipse cx=\"32\" cy=\"6\" rx=\"6\" ry=\"5\" fill=\"${fill}\"/>`\n );\n default: return \"\";\n }\n}\n\n// ─── Eyes ───────────────────────────────────────\n\nfunction renderEyes(\n ei: number,\n eyeCol: string,\n eyeWhite: string,\n lidColor: string,\n full: boolean,\n): string {\n const lx = 25, rx = 39, y = 33;\n let s = \"\";\n\n switch (ei) {\n case 0: // Round\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 1: // Minimal\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n break;\n case 2: // Almond\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n break;\n case 3: // Wide\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 4: // Relaxed\n s += `<ellipse cx=\"${lx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${lx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${lx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${rx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${rx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n break;\n case 5: // Joyful\n s += `<path d=\"M${lx - 4} ${y} Q${lx} ${y + 4} ${lx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>`;\n s += `<path d=\"M${rx - 4} ${y} Q${rx} ${y + 4} ${rx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>`;\n break;\n case 6: // Bright\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n if (full) {\n s += `<line x1=\"${lx + 2.5}\" y1=\"${y - 3.5}\" x2=\"${lx + 4}\" y2=\"${y - 5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<line x1=\"${lx + 3.5}\" y1=\"${y - 2.5}\" x2=\"${lx + 5}\" y2=\"${y - 3.5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n }\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n if (full) {\n s += `<line x1=\"${rx + 2.5}\" y1=\"${y - 3.5}\" x2=\"${rx + 4}\" y2=\"${y - 5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<line x1=\"${rx + 3.5}\" y1=\"${y - 2.5}\" x2=\"${rx + 5}\" y2=\"${y - 3.5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n }\n break;\n case 7: // Gentle\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${lx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${rx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n break;\n default:\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n }\n\n // Eyelid strokes in full detail (except joyful/minimal)\n if (full && ei !== 1 && ei !== 5) {\n s += `<path d=\"M${lx - 4} ${y - 1.5} Q${lx} ${y - 4} ${lx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n s += `<path d=\"M${rx - 4} ${y - 1.5} Q${rx} ${y - 4} ${rx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n }\n\n return s;\n}\n\n// ─── Eyebrows ───────────────────────────────────\n\nfunction renderEyebrows(bi: number, browColor: string): string {\n const lx = 25, rx = 39, y = 27;\n switch (bi) {\n case 0: // Wispy\n return (\n `<line x1=\"${lx - 3}\" y1=\"${y}\" x2=\"${lx + 3}\" y2=\"${y - 0.5}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3}\" y1=\"${y - 0.5}\" x2=\"${rx + 3}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>`\n );\n case 1: // Straight\n return (\n `<line x1=\"${lx - 3.5}\" y1=\"${y}\" x2=\"${lx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3.5}\" y1=\"${y}\" x2=\"${rx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 2: // Natural\n return (\n `<path d=\"M${lx - 3.5} ${y + 0.5} Q${lx} ${y - 1.5} ${lx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 3.5} ${y + 0.5} Q${rx} ${y - 1.5} ${rx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 3: // Arched\n return (\n `<path d=\"M${lx - 4} ${y + 1} Q${lx} ${y - 3} ${lx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 4} ${y + 1} Q${rx} ${y - 3} ${rx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>`\n );\n case 4: // Angled\n return (\n `<polyline points=\"${lx - 3},${y + 1} ${lx},${y - 2} ${lx + 3},${y}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<polyline points=\"${rx - 3},${y} ${rx},${y - 2} ${rx + 3},${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`\n );\n default:\n return \"\";\n }\n}\n\n// ─── Nose ───────────────────────────────────────\n\nfunction renderNose(ni: number, noseFill: string): string {\n const cx = 32, y = 39;\n switch (ni) {\n case 0: // Shadow\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n case 1: // Button\n return `<circle cx=\"${cx}\" cy=\"${y}\" r=\"1.8\" fill=\"${noseFill}\" opacity=\"0.5\"/>`;\n case 2: // Soft\n return `<path d=\"M${cx - 2} ${y + 1} Q${cx} ${y - 2} ${cx + 2} ${y + 1}\" fill=\"none\" stroke=\"${noseFill}\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`;\n case 3: // Nostrils\n return (\n `<circle cx=\"${cx - 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>` +\n `<circle cx=\"${cx + 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>`\n );\n default:\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n }\n}\n\n// ─── Mouth ──────────────────────────────────────\n\nfunction renderMouth(mi: number, lipColor: string, isDark: boolean): string {\n const cx = 32, y = 45;\n const teethCol = isDark ? \"#e8e0d8\" : \"#ffffff\";\n switch (mi) {\n case 0: // Smile\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n case 1: // Calm\n return `<line x1=\"${cx - 3}\" y1=\"${y + 1}\" x2=\"${cx + 3}\" y2=\"${y + 1}\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`;\n case 2: // Happy\n return `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 5} ${cx + 5} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`;\n case 3: // Oh\n return `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"2.5\" ry=\"3\" fill=\"${lipColor}\" opacity=\"0.7\"/>`;\n case 4: // Smirk\n return `<path d=\"M${cx - 4} ${y + 1} Q${cx + 1} ${y + 1} ${cx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>`;\n case 5: // Grin\n return (\n `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 6} ${cx + 5} ${y}\" fill=\"${teethCol}\" stroke=\"${lipColor}\" stroke-width=\"1\"/>` +\n `<line x1=\"${cx - 4}\" y1=\"${y + 1.5}\" x2=\"${cx + 4}\" y2=\"${y + 1.5}\" stroke=\"${lipColor}\" stroke-width=\"0.3\" opacity=\"0.3\"/>`\n );\n case 6: // Flat\n return `<line x1=\"${cx - 4}\" y1=\"${y + 1}\" x2=\"${cx + 4}\" y2=\"${y + 1}\" stroke=\"${lipColor}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`;\n case 7: // Pout\n return (\n `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"3.5\" ry=\"2\" fill=\"${lipColor}\" opacity=\"0.25\"/>` +\n `<path d=\"M${cx - 3} ${y} Q${cx} ${y + 2.5} ${cx + 3} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n default:\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n }\n}\n\n// ─── Accessories ────────────────────────────────\n\nfunction renderAccessory(\n ai: number,\n accessoryColor: string,\n glassesColor: string,\n earringColor: string,\n headbandColor: string,\n): string {\n switch (ai) {\n case 0: return \"\"; // None\n case 1: // Beauty mark\n return `<circle cx=\"40\" cy=\"44\" r=\"0.8\" fill=\"#3a2a2a\"/>`;\n case 2: // Round glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<circle cx=\"25\" cy=\"33\" r=\"5.5\"/>` +\n `<circle cx=\"39\" cy=\"33\" r=\"5.5\"/>` +\n `<line x1=\"30.5\" y1=\"33\" x2=\"33.5\" y2=\"33\"/>` +\n `<line x1=\"19.5\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"44.5\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 3: // Rect glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<rect x=\"19\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<rect x=\"33\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<line x1=\"31\" y1=\"33\" x2=\"33\" y2=\"33\"/>` +\n `<line x1=\"19\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"45\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 4: // Earring\n return (\n `<circle cx=\"10\" cy=\"38\" r=\"1.5\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"10\" cy=\"41\" r=\"2\" fill=\"${earringColor}\" opacity=\"0.8\"/>`\n );\n case 5: // Headband\n return `<rect x=\"13\" y=\"20\" width=\"38\" height=\"3.5\" rx=\"1.5\" fill=\"${headbandColor}\" opacity=\"0.85\"/>`;\n case 6: // Freckles\n return (\n `<g fill=\"#a0785a\" opacity=\"0.35\">` +\n `<circle cx=\"21\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"23\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"19\" cy=\"41.5\" r=\"0.5\"/>` +\n `<circle cx=\"43\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"41\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"45\" cy=\"41.5\" r=\"0.5\"/>` +\n `</g>`\n );\n case 7: // Stud earrings\n return (\n `<circle cx=\"10\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"54\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>`\n );\n case 8: // Aviators\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1.2\">` +\n `<path d=\"M19 30 Q19 28 25 28 Q31 28 31 33 Q31 38 25 38 Q19 38 19 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<path d=\"M33 30 Q33 28 39 28 Q45 28 45 33 Q45 38 39 38 Q33 38 33 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<line x1=\"31\" y1=\"32\" x2=\"33\" y2=\"32\"/>` +\n `<line x1=\"19\" y1=\"31\" x2=\"14\" y2=\"29\"/>` +\n `<line x1=\"45\" y1=\"31\" x2=\"50\" y2=\"29\"/>` +\n `</g>`\n );\n case 9: // Band-Aid\n return (\n `<g>` +\n `<rect x=\"38\" y=\"38\" width=\"8\" height=\"4\" rx=\"1\" fill=\"#f0d0a0\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"40\" y1=\"39\" x2=\"40\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"42\" y1=\"39\" x2=\"42\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"44\" y1=\"39\" x2=\"44\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `</g>`\n );\n default:\n return \"\";\n }\n}\n\n// ─── Main Render Functions ──────────────────────\n\nexport function renderSolFaceSVG(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const { size = 64, theme, traitOverrides, enableBlink, className, colorOverrides } = options ?? {};\n const traits = generateTraits(walletAddress, traitOverrides);\n\n // Resolve detail level\n const detailOpt = options?.detail ?? \"auto\";\n const full = detailOpt === \"full\" || (detailOpt === \"auto\" && size >= 48);\n const flat = theme?.flat ?? false;\n\n // Color palettes\n const skinColors = theme?.skinColors ?? SKIN_COLORS;\n const eyeColors = theme?.eyeColors ?? EYE_COLORS;\n const hairColors = theme?.hairColors ?? HAIR_COLORS;\n const bgColors = theme?.bgColors ?? BG_COLORS;\n\n const skin = colorOverrides?.skin ?? skinColors[traits.skinColor % skinColors.length];\n const eyeCol = colorOverrides?.eyes ?? eyeColors[traits.eyeColor % eyeColors.length];\n const hairCol = colorOverrides?.hair ?? hairColors[traits.hairColor % hairColors.length];\n const bgCol = colorOverrides?.bg ?? bgColors[traits.bgColor % bgColors.length];\n\n // Derived skin colors\n const derived = deriveSkinColors(skin);\n\n const bgOpacity = theme?.bgOpacity ?? 1;\n const bgRadius = theme?.bgRadius ?? 4;\n const browColor = colorOverrides?.eyebrow ?? theme?.eyebrowColor ?? derived.browColor;\n const noseFill = colorOverrides?.nose ?? theme?.noseColor ?? derived.noseFill;\n const lipColor = colorOverrides?.mouth ?? theme?.mouthColor ?? derived.lipColor;\n const accColor = colorOverrides?.accessory ?? theme?.accessoryColor ?? derived.accessoryColor;\n const eyeWhite = colorOverrides?.eyeWhite ?? theme?.eyeWhiteColor ?? derived.eyeWhiteAdapted;\n const glassesColor = theme?.glassesColor ?? \"#4a4a5a\";\n const earringColor = theme?.earringColor ?? blend(skin, \"#d4a840\", 0.4);\n const headbandColor = theme?.headbandColor ?? blend(hairCol, \"#c04040\", 0.5);\n\n // Unique gradient ID prefix (collision-resistant)\n const id = \"sf\" + djb2(walletAddress).toString(36);\n\n // Cheek\n const cheekEnabled = theme?.cheekEnabled ?? true;\n const cheekColor = theme?.cheekColor ?? derived.cheekColor;\n const cheekOpacity = theme?.cheekOpacity ?? derived.cheekOpacity;\n\n const hi = traits.hairStyle % 10;\n const ai = effectiveAccessory(traits);\n\n const classAttr = className ? ` class=\"${className}\"` : \"\";\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" width=\"${size}\" height=\"${size}\"${classAttr}>`;\n\n // Defs\n const glowIntensity = theme?.glowIntensity ?? 0.10;\n svg += buildDefs(id, skin, derived.skinHi, derived.skinLo, hairCol, bgCol, cheekColor, cheekOpacity, flat, full && cheekEnabled, glowIntensity);\n\n // Blink animation\n const blinkEnabled = !!enableBlink;\n const blinkDuration = typeof enableBlink === \"object\" ? (enableBlink.duration ?? 4) : 4;\n const blinkDelay = typeof enableBlink === \"object\" ? (enableBlink.delay ?? 0) : 0;\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n const delayStr = blinkDelay ? ` ${blinkDelay}s` : \"\";\n svg += `<style>@keyframes ${uid}-blink{0%,90%,100%{transform:scaleY(1)}95%{transform:scaleY(0.1)}}.${uid}-eyes{animation:${uid}-blink ${blinkDuration}s ease-in-out${delayStr} infinite;transform-origin:32px 33px}</style>`;\n }\n\n // Background\n const bgFill = flat ? bgCol : `url(#${id}bg)`;\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"${bgFill}\" opacity=\"${bgOpacity}\" rx=\"${bgRadius}\"/>`;\n\n // Hair back (Long, Bob, Wavy — behind face)\n svg += renderHairBack(hi, id, flat);\n\n // Ears\n svg += renderEars(derived.earFill, derived.earShadow);\n\n // Face\n const skinOpacity = theme?.skinOpacity ?? 1;\n svg += renderFace(id, skin, flat, skinOpacity);\n\n // Face overlays (glow, chin shadow, cheeks, jawline) — full detail only\n const shadowEnabled = theme?.shadowEnabled ?? true;\n if (full && cheekEnabled && shadowEnabled) {\n svg += renderFaceOverlays(id, flat);\n }\n\n // Headband (renders before eyes, after face)\n if (ai === 5) {\n svg += renderAccessory(5, accColor, glassesColor, earringColor, headbandColor);\n }\n\n // Hair front\n svg += renderHairFront(hi, id, hairCol, skin, flat);\n\n // Eyes\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n svg += `<g class=\"${uid}-eyes\">`;\n }\n svg += renderEyes(traits.eyeStyle % 8, eyeCol, eyeWhite, derived.lidColor, full);\n if (blinkEnabled) svg += `</g>`;\n\n // Eyebrows\n svg += renderEyebrows(traits.eyebrows % 5, browColor);\n\n // Nose\n svg += renderNose(traits.nose % 4, noseFill);\n\n // Mouth\n svg += renderMouth(traits.mouth % 8, lipColor, derived.isDark);\n\n // Accessories (except headband, already rendered)\n if (ai !== 0 && ai !== 5) {\n svg += renderAccessory(ai, accColor, glassesColor, earringColor, headbandColor);\n }\n\n // Border\n if (theme?.border) {\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"none\" stroke=\"${theme.border.color}\" stroke-width=\"${theme.border.width}\" rx=\"${bgRadius}\"/>`;\n }\n\n svg += `</svg>`;\n return svg;\n}\n\nexport function renderSolFaceDataURI(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function renderSolFaceBase64(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — AI Agent Description Generator\n// Produces natural language descriptions of a wallet's SolFace\n// for use in system prompts, bios, and self-reference.\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, effectiveAccessory, type SolFaceTraits } from \"./traits\";\n\n// ─── Vocabulary Maps ─────────────────────────────────────────\n\nconst SKIN_TONES: Record<number, string> = {\n 0: \"porcelain\",\n 1: \"ivory\",\n 2: \"fair\",\n 3: \"light\",\n 4: \"sand\",\n 5: \"golden\",\n 6: \"warm\",\n 7: \"caramel\",\n 8: \"brown\",\n 9: \"deep\",\n};\n\nconst EYE_STYLES: Record<number, string> = {\n 0: \"round, wide-open\",\n 1: \"small and minimal\",\n 2: \"almond-shaped\",\n 3: \"wide and expressive\",\n 4: \"relaxed, half-lidded\",\n 5: \"joyful, crescent-shaped\",\n 6: \"bright and sparkling\",\n 7: \"gentle and narrow\",\n};\n\nconst EYE_COLORS_DESC: Record<number, string> = {\n 0: \"dark brown\",\n 1: \"blue\",\n 2: \"green\",\n 3: \"hazel\",\n 4: \"gray\",\n};\n\nconst EYEBROW_STYLES: Record<number, string> = {\n 0: \"wispy\",\n 1: \"straight\",\n 2: \"natural\",\n 3: \"elegantly arched\",\n 4: \"sharply angled\",\n};\n\nconst NOSE_STYLES: Record<number, string> = {\n 0: \"a subtle shadow nose\",\n 1: \"a small button nose\",\n 2: \"a soft curved nose\",\n 3: \"a button nose with visible nostrils\",\n};\n\nconst MOUTH_STYLES: Record<number, string> = {\n 0: \"a gentle smile\",\n 1: \"a calm, neutral expression\",\n 2: \"a happy grin\",\n 3: \"a surprised O-shaped mouth\",\n 4: \"a confident smirk\",\n 5: \"a wide, toothy grin\",\n 6: \"a flat, straight expression\",\n 7: \"a soft pout\",\n};\n\nconst HAIR_STYLES: Record<number, string> = {\n 0: \"bald, with no hair\",\n 1: \"short, neatly cropped hair\",\n 2: \"bouncy, curly hair\",\n 3: \"side-swept hair\",\n 4: \"a voluminous puff\",\n 5: \"long hair that falls past the shoulders\",\n 6: \"a clean bob cut\",\n 7: \"a close buzz cut\",\n 8: \"flowing, wavy hair\",\n 9: \"a neat topknot\",\n};\n\nconst HAIR_COLORS_DESC: Record<number, string> = {\n 0: \"jet black\",\n 1: \"espresso brown\",\n 2: \"walnut\",\n 3: \"honey blonde\",\n 4: \"copper red\",\n 5: \"silver\",\n 6: \"charcoal\",\n 7: \"burgundy\",\n 8: \"strawberry\",\n 9: \"ginger\",\n};\n\nconst ACCESSORY_DESC: Record<number, string> = {\n 0: \"\",\n 1: \"a beauty mark\",\n 2: \"round glasses\",\n 3: \"rectangular glasses\",\n 4: \"a dangling earring\",\n 5: \"a headband\",\n 6: \"freckles\",\n 7: \"stud earrings\",\n 8: \"aviator sunglasses\",\n 9: \"a band-aid\",\n};\n\nconst BG_COLORS_DESC: Record<number, string> = {\n 0: \"rose\",\n 1: \"olive\",\n 2: \"sage\",\n 3: \"fern\",\n 4: \"mint\",\n 5: \"ocean\",\n 6: \"sky\",\n 7: \"lavender\",\n 8: \"orchid\",\n 9: \"blush\",\n};\n\n// ─── Description Builder ─────────────────────────────────────\n\nexport interface DescribeOptions {\n includeBackground?: boolean;\n format?: \"paragraph\" | \"structured\" | \"compact\";\n perspective?: \"first\" | \"third\";\n name?: string;\n}\n\nexport function describeAppearance(\n walletAddress: string,\n options?: DescribeOptions,\n): string {\n const traits = generateTraits(walletAddress);\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\nexport function describeTraits(\n traits: SolFaceTraits,\n options?: DescribeOptions,\n): string {\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\n// ─── Builders ────────────────────────────────────────────────\n\nfunction buildParagraph(\n t: SolFaceTraits,\n perspective: \"first\" | \"third\",\n name?: string,\n includeBg?: boolean,\n): string {\n const parts: string[] = [];\n const ai = effectiveAccessory(t);\n\n const subject = perspective === \"first\"\n ? (name ? `I'm ${name}. I have` : \"I have\")\n : (name ? `${name} has` : \"This SolFace has\");\n\n const im = perspective === \"first\" ? \"I'm\" : \"They're\";\n\n // Face + skin (all squircle now)\n parts.push(`${subject} a squircle face with ${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n\n // Eyes\n const eyeStyle = EYE_STYLES[t.eyeStyle] ?? \"round\";\n const eyeColor = EYE_COLORS_DESC[t.eyeColor] ?? \"dark\";\n parts.push(`${eyeStyle} ${eyeColor} eyes`);\n\n // Eyebrows\n const brows = EYEBROW_STYLES[t.eyebrows];\n if (brows) parts.push(`${brows} eyebrows`);\n\n // Hair\n const hairStyle = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hairColor = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n if (t.hairStyle === 0) {\n parts.push(perspective === \"first\" ? \"and am bald\" : \"and is bald\");\n } else if (hairStyle.startsWith(\"a \")) {\n parts.push(`and a ${hairColor} ${hairStyle.slice(2)}`);\n } else {\n parts.push(`and ${hairColor} ${hairStyle}`);\n }\n\n // Build main sentence\n let desc = parts[0];\n if (parts.length > 2) {\n desc += \", \" + parts.slice(1, -1).join(\", \") + \", \" + parts[parts.length - 1];\n } else if (parts.length === 2) {\n desc += \" and \" + parts[1];\n }\n desc += \".\";\n\n // Nose\n const nose = NOSE_STYLES[t.nose];\n if (nose) {\n const noseSubject = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${noseSubject} ${nose}.`;\n }\n\n // Accessory\n const acc = ACCESSORY_DESC[ai];\n if (acc) {\n desc += ` ${im} wearing ${acc}.`;\n }\n\n // Mouth\n const mouth = MOUTH_STYLES[t.mouth] ?? \"a smile\";\n const mouthVerb = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${mouthVerb} ${mouth}.`;\n\n // Background\n if (includeBg) {\n const bg = BG_COLORS_DESC[t.bgColor] ?? \"colorful\";\n desc += ` The background is ${bg}.`;\n }\n\n return desc;\n}\n\nfunction buildStructured(t: SolFaceTraits, includeBg: boolean): string {\n const ai = effectiveAccessory(t);\n const lines: string[] = [\n `Face: squircle`,\n `Skin: ${SKIN_TONES[t.skinColor] ?? \"warm\"}`,\n `Eyes: ${EYE_STYLES[t.eyeStyle] ?? \"round\"}, ${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"}`,\n `Eyebrows: ${EYEBROW_STYLES[t.eyebrows] ?? \"wispy\"}`,\n ];\n\n const nose = NOSE_STYLES[t.nose];\n if (nose) lines.push(`Nose: ${nose.replace(/^a /, \"\")}`);\n\n lines.push(`Mouth: ${MOUTH_STYLES[t.mouth] ?? \"smile\"}`);\n\n if (t.hairStyle === 0) {\n lines.push(\"Hair: bald\");\n } else {\n const hs = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n lines.push(`Hair: ${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) lines.push(`Accessory: ${acc}`);\n\n if (includeBg) {\n lines.push(`Background: ${BG_COLORS_DESC[t.bgColor] ?? \"colorful\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildCompact(t: SolFaceTraits): string {\n const ai = effectiveAccessory(t);\n const parts: string[] = [];\n\n parts.push(`squircle face`);\n parts.push(`${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n parts.push(`${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"} ${EYE_STYLES[t.eyeStyle] ?? \"round\"} eyes`);\n\n if (t.hairStyle === 0) {\n parts.push(\"bald\");\n } else {\n const raw = HAIR_STYLES[t.hairStyle] ?? \"hair\";\n const hs = raw.includes(\",\") ? raw.replace(/.*,\\s*/, \"\") : raw;\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n parts.push(`${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) parts.push(acc);\n\n parts.push((MOUTH_STYLES[t.mouth] ?? \"smiling\").replace(/^a /, \"\"));\n\n return parts.join(\", \");\n}\n\n// ─── Alt Text Helper ─────────────────────────────────────────\n\nexport function solFaceAltText(walletAddress: string): string {\n return `SolFace avatar: ${describeAppearance(walletAddress, { format: \"compact\", includeBackground: false })}`;\n}\n\n// ─── System Prompt Helper ────────────────────────────────────\n\nexport function agentAppearancePrompt(\n walletAddress: string,\n agentName?: string,\n): string {\n const desc = describeAppearance(walletAddress, {\n perspective: \"first\",\n name: agentName,\n includeBackground: false,\n format: \"paragraph\",\n });\n\n const hash = (djb2Simple(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n\n return `My visual identity is a SolFace avatar (ID: ${hash}) derived from my wallet address. ${desc} This appearance is deterministic — anyone who looks up my wallet will see the same face.`;\n}\n\n// Inline djb2 to avoid circular dependency\nfunction djb2Simple(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — Preset Themes\n// ═══════════════════════════════════════════════════════════════\n\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Default (base look — gradients, no overrides) ─\n\nexport const defaultTheme: SolFaceTheme = {};\n\n// ─── Base Themes ────────────────────────────────\n\nexport const darkTheme: SolFaceTheme = {\n bgColors: [\"#1a1b23\", \"#1e1428\", \"#0a1e38\", \"#1b2838\", \"#201028\",\n \"#141a28\", \"#18122a\", \"#1a2020\", \"#221822\", \"#1e1020\"],\n eyeWhiteColor: \"#d8d0c8\",\n bgOpacity: 1,\n bgRadius: 4,\n border: { color: \"#333340\", width: 0.5 },\n};\n\nexport const lightTheme: SolFaceTheme = {\n bgColors: [\"#f5e8ea\", \"#f0f0d8\", \"#e4f0e6\", \"#d8f0e8\", \"#e0ece8\",\n \"#dce8f0\", \"#e0e4f0\", \"#e0d8f0\", \"#f0e0ee\", \"#f0d8e4\"],\n bgOpacity: 1,\n bgRadius: 8,\n};\n\nexport const monoTheme: SolFaceTheme = {\n skinColors: [\"#e8e8e8\", \"#d4d4d4\", \"#c0c0c0\", \"#a8a8a8\", \"#909090\",\n \"#787878\", \"#606060\", \"#505050\", \"#404040\", \"#303030\"],\n eyeColors: [\"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\"],\n hairColors: [\"#1a1a1a\", \"#2a2a2a\", \"#404040\", \"#555\", \"#707070\",\n \"#888\", \"#a0a0a0\", \"#b8b8b8\", \"#d0d0d0\", \"#e0e0e0\"],\n bgColors: [\"#e8e0e0\", \"#e0e0d0\", \"#d8e0d8\", \"#d0e0d8\", \"#d8e0e0\",\n \"#d0d8e0\", \"#d4d4e0\", \"#d4d0e0\", \"#e0d8e0\", \"#e0d0d8\"],\n mouthColor: \"#666\",\n eyebrowColor: \"#555\",\n accessoryColor: \"#777\",\n eyeWhiteColor: \"#f0f0f0\",\n bgOpacity: 0.5,\n bgRadius: 4,\n};\n\nexport const flatTheme: SolFaceTheme = {\n flat: true,\n};\n\nexport const transparentTheme: SolFaceTheme = {\n flat: true,\n bgOpacity: 0,\n};\n\n// ─── React-Only: Liquid Glass ───────────────────\n\nexport const glassTheme: SolFaceTheme = {\n bgOpacity: 0.15,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 12,\n _saturate: 1.8,\n _tintOpacity: 0.12,\n _tintColor: \"rgba(255,255,255,1)\",\n _borderOpacity: 0.25,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.25)\",\n _specularOpacity: 0.25,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 50,\n _lightAngle: 135,\n _rimIntensity: 0.08,\n _shadow: \"0 8px 32px rgba(0,0,0,0.12)\",\n};\n\nexport const glassDarkTheme: SolFaceTheme = {\n bgOpacity: 0.2,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 16,\n _saturate: 2.0,\n _tintOpacity: 0.08,\n _tintColor: \"rgba(0,0,0,1)\",\n _borderOpacity: 0.15,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.15)\",\n _specularOpacity: 0.15,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 40,\n _lightAngle: 135,\n _rimIntensity: 0.05,\n _shadow: \"0 8px 32px rgba(0,0,0,0.25)\",\n};\n\n// ─── React-Only: Pixel Art ──────────────────────\n\nexport const pixelTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 16,\n _pixelRounded: true,\n _pixelOutline: true,\n _pixelOutlineColor: \"#222\",\n _pixelOutlineWidth: 2,\n};\n\nexport const pixelRetroTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 12,\n _pixelRounded: false,\n _pixelOutline: true,\n _pixelOutlineColor: \"#000\",\n _pixelOutlineWidth: 2,\n _pixelScanlines: true,\n _pixelScanlineOpacity: 0.1,\n _pixelScanlineSpacing: 2,\n _pixelShadow: true,\n _pixelShadowColor: \"rgba(0,0,0,0.4)\",\n _pixelShadowOffset: 3,\n};\n\nexport const pixelCleanTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 24,\n _pixelRounded: true,\n _pixelOutline: false,\n};\n\n// ─── Theme Map ──────────────────────────────────\n\nexport const PRESET_THEMES: Record<string, SolFaceTheme> = {\n default: defaultTheme,\n dark: darkTheme,\n light: lightTheme,\n mono: monoTheme,\n flat: flatTheme,\n transparent: transparentTheme,\n glass: glassTheme,\n glassDark: glassDarkTheme,\n pixel: pixelTheme,\n pixelRetro: pixelRetroTheme,\n pixelClean: pixelCleanTheme,\n};\n\nexport function getPresetTheme(\n name: string,\n overrides?: Partial<SolFaceTheme>,\n): SolFaceTheme {\n const base = PRESET_THEMES[name];\n if (!base) return (overrides as SolFaceTheme) ?? {};\n return overrides ? { ...base, ...overrides } : base;\n}\n"],"mappings":"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","names":["cdn_exports","__export","cdn_default","SKIN_COLORS","EYE_COLORS","HAIR_COLORS","BG_COLORS","djb2","str","hash","i","mulberry32","seed","s","generateTraits","walletAddress","overrides","rand","traits","effectiveAccessory","ai","hi","FACE_LABELS","SKIN_LABELS","EYE_STYLE_LABELS","EYE_COLOR_LABELS","BROW_LABELS","NOSE_LABELS","MOUTH_LABELS","HAIR_STYLE_LABELS","HAIR_COLOR_LABELS","ACCESSORY_LABELS","BG_COLOR_LABELS","getTraitLabels","traitHash","resolveTheme","themeName","themes","K","rotr","n","x","sha256","input","msg","bitLen","padLen","totalLen","buf","dv","h0","h1","h2","h3","h4","h5","h6","h7","W","offset","i","s0","s1","a","b","c","d","e","f","g","h","S1","ch","temp1","S0","maj","temp2","out","outView","sha256Hex","ADJECTIVES","NOUNS","BLOCKED_COMBOS","mulberry32","seed","a","DOMAIN","deriveName","wallet","format","options","id","deriveIdentity","adjectives","ADJECTIVES","nouns","NOUNS","blocked","BLOCKED_COMBOS","domain","hash","sha256","hex","sha256Hex","rng","adj1","noun1","adj2","noun2","discriminator","hexToRgb","hex","h","rgbToHex","g","b","v","darken","pct","r","lighten","blend","a","r1","g1","b1","r2","g2","b2","luminance","deriveSkinColors","skin","sL","isDark","skinHi","skinLo","skinMid","sr","sg","sb","cheekColor","rB","gD","bD","cheekOpacity","lipT","lipBase","midBoost","lipBlend","lipRaw","lr","lg","lb","lipColor","browColor","noseFill","earT","earFill","earShadow","lidColor","ewT","eyeWhiteAdapted","warmth","accessoryColor","buzzOpacity","hairCol","hr","hg","hb","djb2","str","hash","i","buildDefs","id","skin","skinHi","skinLo","hairCol","bgCol","cheekColor","cheekOpacity","flat","full","glowIntensity","d","lighten","darken","renderHairBack","hi","fill","renderEars","earFill","earShadow","renderFace","opacity","opAttr","renderFaceOverlays","renderHairFront","bOp","buzzOpacity","renderEyes","ei","eyeCol","eyeWhite","lidColor","s","renderEyebrows","bi","browColor","renderNose","ni","noseFill","renderMouth","mi","lipColor","isDark","teethCol","renderAccessory","ai","accessoryColor","glassesColor","earringColor","headbandColor","renderSolFaceSVG","walletAddress","options","size","theme","traitOverrides","enableBlink","className","colorOverrides","traits","generateTraits","detailOpt","skinColors","SKIN_COLORS","eyeColors","EYE_COLORS","hairColors","HAIR_COLORS","bgColors","BG_COLORS","derived","deriveSkinColors","bgOpacity","bgRadius","accColor","blend","cheekEnabled","effectiveAccessory","classAttr","svg","blinkEnabled","blinkDuration","blinkDelay","uid","delayStr","bgFill","skinOpacity","shadowEnabled","renderSolFaceDataURI","renderSolFaceBase64","SKIN_TONES","EYE_STYLES","EYE_COLORS_DESC","EYEBROW_STYLES","NOSE_STYLES","MOUTH_STYLES","HAIR_STYLES","HAIR_COLORS_DESC","ACCESSORY_DESC","BG_COLORS_DESC","describeAppearance","walletAddress","options","traits","generateTraits","includeBackground","format","perspective","name","buildStructured","buildCompact","buildParagraph","buildParagraph","t","perspective","name","includeBg","parts","ai","effectiveAccessory","subject","im","SKIN_TONES","eyeStyle","EYE_STYLES","eyeColor","EYE_COLORS_DESC","brows","EYEBROW_STYLES","hairStyle","HAIR_STYLES","hairColor","HAIR_COLORS_DESC","desc","nose","NOSE_STYLES","noseSubject","acc","ACCESSORY_DESC","mouth","MOUTH_STYLES","mouthVerb","bg","BG_COLORS_DESC","buildStructured","lines","hs","hc","buildCompact","raw","solFaceAltText","walletAddress","describeAppearance","agentAppearancePrompt","agentName","djb2Simple","str","hash","i","defaultTheme","darkTheme","lightTheme","monoTheme","flatTheme","transparentTheme","glassTheme","glassDarkTheme","pixelTheme","pixelRetroTheme","pixelCleanTheme","PRESET_THEMES","getPresetTheme","name","overrides","base","mountSolFace","element","walletAddress","options","el","renderSolFaceSVG","setSolFaceImg","img","renderSolFaceDataURI","solFaceAltText","autoInit","root","wallet","size","blink","themeName","flat","detail","theme","PRESET_THEMES","SolFaces","generateTraits","deriveName","deriveIdentity","getTraitLabels","traitHash","resolveTheme","effectiveAccessory","renderSolFaceBase64","describeAppearance","agentAppearancePrompt","getPresetTheme","hexToRgb","rgbToHex","darken","lighten","blend","luminance","deriveSkinColors","cdn_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/cdn.ts","../src/core/traits.ts","../src/names/sha256.ts","../src/names/constants.ts","../src/names/derive.ts","../src/core/colors.ts","../src/core/renderer.ts","../src/core/describe.ts","../src/themes/presets.ts"],"sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — CDN Bundle (IIFE / UMD)\n// Single <script> tag integration. No build step required.\n//\n// Usage:\n// <script src=\"https://unpkg.com/solfaces/dist/solfaces.cdn.js\"></script>\n// <div data-solface=\"7xKXq...\" data-solface-size=\"48\"></div>\n// <script>SolFaces.autoInit();</script>\n//\n// Or programmatic:\n// <script>\n// const svg = SolFaces.renderSVG(\"7xKXq...\", { size: 64 });\n// document.getElementById(\"avatar\").innerHTML = svg;\n// </script>\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, getTraitLabels, traitHash, resolveTheme, effectiveAccessory } from \"./core/traits\";\nimport { deriveName, deriveIdentity } from \"./names\";\nimport { renderSolFaceSVG, renderSolFaceDataURI, renderSolFaceBase64 } from \"./core/renderer\";\nimport { describeAppearance, solFaceAltText, agentAppearancePrompt } from \"./core/describe\";\nimport { hexToRgb, rgbToHex, darken, lighten, blend, luminance, deriveSkinColors } from \"./core/colors\";\nimport { PRESET_THEMES, getPresetTheme } from \"./themes/presets\";\n\nimport type { RenderOptions } from \"./core/traits\";\n\n// ─── DOM Helpers ─────────────────────────────────────────────\n\nfunction mountSolFace(\n element: HTMLElement | string,\n walletAddress: string,\n options?: RenderOptions,\n): () => void {\n const el = typeof element === \"string\"\n ? document.querySelector<HTMLElement>(element)\n : element;\n\n if (!el) {\n console.warn(`[SolFaces] Element not found: ${element}`);\n return () => {};\n }\n\n el.innerHTML = renderSolFaceSVG(walletAddress, options);\n return () => { el.innerHTML = \"\"; };\n}\n\nfunction setSolFaceImg(\n img: HTMLImageElement | string,\n walletAddress: string,\n options?: RenderOptions,\n): void {\n const el = typeof img === \"string\"\n ? document.querySelector<HTMLImageElement>(img)\n : img;\n\n if (!el) return;\n el.src = renderSolFaceDataURI(walletAddress, options);\n el.alt = solFaceAltText(walletAddress);\n}\n\nfunction autoInit(root: HTMLElement | Document = document): void {\n const elements = root.querySelectorAll<HTMLElement>(\"[data-solface]\");\n elements.forEach((el) => {\n const wallet = el.getAttribute(\"data-solface\");\n if (!wallet) return;\n\n const size = parseInt(el.getAttribute(\"data-solface-size\") ?? \"64\", 10);\n const blink = el.getAttribute(\"data-solface-blink\") === \"true\";\n const themeName = el.getAttribute(\"data-solface-theme\") as string | null;\n const flat = el.getAttribute(\"data-solface-flat\") === \"true\";\n const detail = el.getAttribute(\"data-solface-detail\") as \"full\" | \"simplified\" | \"auto\" | null;\n\n let theme = themeName && themeName in PRESET_THEMES\n ? PRESET_THEMES[themeName as keyof typeof PRESET_THEMES]\n : undefined;\n\n if (flat && theme) {\n theme = { ...theme, flat: true };\n } else if (flat) {\n theme = { flat: true };\n }\n\n mountSolFace(el, wallet, {\n size,\n enableBlink: blink,\n theme,\n detail: detail ?? \"auto\",\n });\n });\n}\n\n// ─── Global API ──────────────────────────────────────────────\n\nconst SolFaces = {\n // Core\n generateTraits,\n deriveName,\n deriveIdentity,\n getTraitLabels,\n traitHash,\n resolveTheme,\n effectiveAccessory,\n\n // Rendering\n renderSVG: renderSolFaceSVG,\n renderDataURI: renderSolFaceDataURI,\n renderBase64: renderSolFaceBase64,\n\n // AI / Description\n describe: describeAppearance,\n altText: solFaceAltText,\n agentPrompt: agentAppearancePrompt,\n\n // DOM\n mount: mountSolFace,\n setImg: setSolFaceImg,\n autoInit,\n\n // Themes\n themes: PRESET_THEMES,\n getTheme: getPresetTheme,\n\n // Color utilities\n colors: { hexToRgb, rgbToHex, darken, lighten, blend, luminance, deriveSkinColors },\n};\n\n// Attach to window for <script> tag usage\nif (typeof window !== \"undefined\") {\n (window as unknown as Record<string, unknown>).SolFaces = SolFaces;\n}\n\n// Auto-initialize on DOMContentLoaded if data-solface elements exist\nif (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n if (document.querySelector(\"[data-solface]\")) {\n autoInit();\n }\n });\n } else {\n if (document.querySelector(\"[data-solface]\")) {\n autoInit();\n }\n }\n}\n\nexport default SolFaces;\n","// ═══════════════════════════════════════════════════\n// SOLFACES v2 — Deterministic avatar trait engine\n// ═══════════════════════════════════════════════════\n\n// ─── Types ────────────────────────────────────────\n\nexport interface SolFaceTraits {\n faceShape: number; // 0-3 (consumed for PRNG ordering, all render as squircle)\n skinColor: number; // 0-9\n eyeStyle: number; // 0-7\n eyeColor: number; // 0-4\n eyebrows: number; // 0-4\n nose: number; // 0-3\n mouth: number; // 0-7\n hairStyle: number; // 0-9\n hairColor: number; // 0-9\n accessory: number; // 0-9\n bgColor: number; // 0-9\n}\n\nexport interface SolFaceTheme {\n // Palette overrides\n skinColors?: string[];\n eyeColors?: string[];\n hairColors?: string[];\n bgColors?: string[];\n\n // Single-color overrides\n mouthColor?: string;\n eyebrowColor?: string;\n accessoryColor?: string;\n eyeWhiteColor?: string;\n noseColor?: string;\n glassesColor?: string;\n earringColor?: string;\n headbandColor?: string;\n\n // Layout\n bgOpacity?: number;\n bgRadius?: number;\n border?: { color: string; width: number };\n\n // Rendering options\n flat?: boolean;\n cheekEnabled?: boolean;\n cheekColor?: string;\n cheekOpacity?: number;\n skinOpacity?: number;\n shadowEnabled?: boolean;\n glowIntensity?: number;\n\n // React-only: pixel art mode\n _pixel?: boolean;\n _pixelDensity?: number;\n _pixelRounded?: boolean;\n _pixelOutline?: boolean;\n _pixelOutlineColor?: string;\n _pixelOutlineWidth?: number;\n _pixelContrast?: number;\n _pixelSaturation?: number;\n _pixelBrightness?: number;\n _pixelScanlines?: boolean;\n _pixelScanlineOpacity?: number;\n _pixelScanlineSpacing?: number;\n _pixelGrid?: boolean;\n _pixelGridOpacity?: number;\n _pixelGridColor?: string;\n _pixelShadow?: boolean;\n _pixelShadowColor?: string;\n _pixelShadowOffset?: number;\n\n // React-only: liquid glass mode\n _glass?: boolean;\n _blurRadius?: number;\n _saturate?: number;\n _tintOpacity?: number;\n _tintColor?: string;\n _borderOpacity?: number;\n _borderWidth?: number;\n _borderColor?: string;\n _specularOpacity?: number;\n _specularColor?: string;\n _specularEnd?: number;\n _lightAngle?: number;\n _rimIntensity?: number;\n _shadow?: string;\n}\n\nexport interface RenderOptions {\n size?: number;\n theme?: SolFaceTheme;\n traitOverrides?: Partial<SolFaceTraits>;\n enableBlink?: boolean | {\n duration?: number;\n delay?: number;\n };\n className?: string;\n detail?: \"full\" | \"simplified\" | \"auto\";\n colorOverrides?: {\n skin?: string;\n eyes?: string;\n hair?: string;\n bg?: string;\n mouth?: string;\n eyebrow?: string;\n accessory?: string;\n nose?: string;\n eyeWhite?: string;\n };\n}\n\n// ─── Color Palettes ──────────────────────────────\n\nexport const SKIN_COLORS = [\n \"#faeae5\", \"#efd6c8\", \"#e4c5aa\", \"#d5b590\", \"#c59e77\",\n \"#b4875f\", \"#9d6d4d\", \"#805742\", \"#654134\", \"#4b2d25\",\n];\n\nexport const EYE_COLORS = [\n \"#382414\", \"#3868A8\", \"#38784C\", \"#808838\", \"#586878\",\n];\n\nexport const HAIR_COLORS = [\n \"#1A1A24\", \"#4C3428\", \"#887058\", \"#D4B868\", \"#A84830\",\n \"#C0C0CC\", \"#484858\", \"#783850\", \"#D8B0A0\", \"#C08048\",\n];\n\nexport const BG_COLORS = [\n \"#b98387\", \"#a9a360\", \"#9eb785\", \"#69ab79\", \"#81bbb0\",\n \"#6499af\", \"#7f8bbd\", \"#8869ab\", \"#b785b3\", \"#ab6984\",\n];\n\n// ─── Hashing (djb2) ─────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── PRNG (mulberry32) ──────────────────────────\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n// ─── Trait Generation ───────────────────────────\n\nexport function generateTraits(\n walletAddress: string,\n overrides?: Partial<SolFaceTraits>\n): SolFaceTraits {\n const seed = djb2(walletAddress);\n const rand = mulberry32(seed);\n\n // IMPORTANT: Order must NEVER change — shifts all downstream values.\n // faceShape is consumed for PRNG ordering but unused in rendering (all squircle).\n const traits: SolFaceTraits = {\n faceShape: Math.floor(rand() * 4),\n skinColor: Math.floor(rand() * 10),\n eyeStyle: Math.floor(rand() * 8),\n eyeColor: Math.floor(rand() * 5),\n eyebrows: Math.floor(rand() * 5),\n nose: Math.floor(rand() * 4),\n mouth: Math.floor(rand() * 8),\n hairStyle: Math.floor(rand() * 10),\n hairColor: Math.floor(rand() * 10),\n accessory: Math.floor(rand() * 10),\n bgColor: Math.floor(rand() * 10),\n };\n\n return overrides ? { ...traits, ...overrides } : traits;\n}\n\n// ─── Effective Accessory ────────────────────────\n// Earrings/studs are suppressed on long/bob hair\n\nexport function effectiveAccessory(traits: SolFaceTraits): number {\n const ai = traits.accessory % 10;\n const hi = traits.hairStyle % 10;\n if ((ai === 4 || ai === 7) && (hi === 5 || hi === 6)) return 0;\n return ai;\n}\n\n// ─── Trait Labels ───────────────────────────────\n\nconst FACE_LABELS = [\"Squircle\"];\nconst SKIN_LABELS = [\n \"Porcelain\", \"Ivory\", \"Fair\", \"Light\", \"Sand\",\n \"Golden\", \"Warm\", \"Caramel\", \"Brown\", \"Deep\",\n];\nconst EYE_STYLE_LABELS = [\"Round\", \"Minimal\", \"Almond\", \"Wide\", \"Relaxed\", \"Joyful\", \"Bright\", \"Gentle\"];\nconst EYE_COLOR_LABELS = [\"Chocolate\", \"Sky\", \"Emerald\", \"Hazel\", \"Storm\"];\nconst BROW_LABELS = [\"Wispy\", \"Straight\", \"Natural\", \"Arched\", \"Angled\"];\nconst NOSE_LABELS = [\"Shadow\", \"Button\", \"Soft\", \"Nostrils\"];\nconst MOUTH_LABELS = [\"Smile\", \"Calm\", \"Happy\", \"Oh\", \"Smirk\", \"Grin\", \"Flat\", \"Pout\"];\nconst HAIR_STYLE_LABELS = [\n \"Bald\", \"Short\", \"Curly\", \"Side Sweep\", \"Puff\",\n \"Long\", \"Bob\", \"Buzz\", \"Wavy\", \"Topknot\",\n];\nconst HAIR_COLOR_LABELS = [\n \"Black\", \"Espresso\", \"Walnut\", \"Honey\", \"Copper\",\n \"Silver\", \"Charcoal\", \"Burgundy\", \"Strawberry\", \"Ginger\",\n];\nconst ACCESSORY_LABELS = [\n \"None\", \"Beauty Mark\", \"Round Glasses\", \"Rect Glasses\", \"Earring\",\n \"Headband\", \"Freckles\", \"Stud Earrings\", \"Aviators\", \"Band-Aid\",\n];\nconst BG_COLOR_LABELS = [\n \"Rose\", \"Olive\", \"Sage\", \"Fern\", \"Mint\",\n \"Ocean\", \"Sky\", \"Lavender\", \"Orchid\", \"Blush\",\n];\n\nexport function getTraitLabels(traits: SolFaceTraits): Record<string, string> {\n return {\n faceShape: FACE_LABELS[0],\n skinColor: SKIN_LABELS[traits.skinColor] ?? \"Fair\",\n eyeStyle: EYE_STYLE_LABELS[traits.eyeStyle] ?? \"Round\",\n eyeColor: EYE_COLOR_LABELS[traits.eyeColor] ?? \"Chocolate\",\n eyebrows: BROW_LABELS[traits.eyebrows] ?? \"Wispy\",\n nose: NOSE_LABELS[traits.nose] ?? \"Shadow\",\n mouth: MOUTH_LABELS[traits.mouth] ?? \"Smile\",\n hairStyle: HAIR_STYLE_LABELS[traits.hairStyle] ?? \"Bald\",\n hairColor: HAIR_COLOR_LABELS[traits.hairColor] ?? \"Black\",\n accessory: ACCESSORY_LABELS[effectiveAccessory(traits)] ?? \"None\",\n bgColor: BG_COLOR_LABELS[traits.bgColor] ?? \"Rose\",\n };\n}\n\n// ─── Trait Hash ─────────────────────────────────\n\nexport function traitHash(walletAddress: string): string {\n return (djb2(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// ─── Theme Utilities ────────────────────────────\n\nexport function resolveTheme(\n themeName?: string,\n themes?: Record<string, SolFaceTheme>\n): SolFaceTheme | undefined {\n if (!themeName || !themes) return undefined;\n return themes[themeName];\n}\n\nexport function mergeTheme(\n base: SolFaceTheme | null | undefined,\n overrides: SolFaceTheme | null | undefined\n): SolFaceTheme | null {\n if (!base) return overrides || null;\n if (!overrides) return base;\n return { ...base, ...overrides };\n}\n","// ═══════════════════════════════════════════════════════════════\n// Pure-JS SHA-256 — NIST FIPS 180-4\n// Synchronous, zero dependencies, works in all JS environments.\n// ═══════════════════════════════════════════════════════════════\n\nconst K: readonly number[] = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction rotr(n: number, x: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n\nexport function sha256(input: string): Uint8Array {\n // Encode UTF-8\n const encoder = new TextEncoder();\n const msg = encoder.encode(input);\n const bitLen = msg.length * 8;\n\n // Padding: append 1-bit, zeros, then 64-bit big-endian length\n const padLen = 64 - ((msg.length + 9) % 64);\n const totalLen = msg.length + 1 + (padLen === 64 ? 0 : padLen) + 8;\n const buf = new Uint8Array(totalLen);\n buf.set(msg);\n buf[msg.length] = 0x80;\n // Write 64-bit big-endian length (we only use lower 32 bits since JS strings are limited)\n const dv = new DataView(buf.buffer);\n dv.setUint32(totalLen - 4, bitLen, false);\n\n // Initial hash values\n let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;\n let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\n\n const W = new Int32Array(64);\n\n // Process each 512-bit (64-byte) block\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let i = 0; i < 16; i++) {\n W[i] = dv.getInt32(offset + i * 4, false);\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(7, W[i - 15]) ^ rotr(18, W[i - 15]) ^ (W[i - 15] >>> 3);\n const s1 = rotr(17, W[i - 2]) ^ rotr(19, W[i - 2]) ^ (W[i - 2] >>> 10);\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) | 0;\n }\n\n let a = h0, b = h1, c = h2, d = h3;\n let e = h4, f = h5, g = h6, h = h7;\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(6, e) ^ rotr(11, e) ^ rotr(25, e);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[i] + W[i]) | 0;\n const S0 = rotr(2, a) ^ rotr(13, a) ^ rotr(22, a);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + maj) | 0;\n\n h = g; g = f; f = e; e = (d + temp1) | 0;\n d = c; c = b; b = a; a = (temp1 + temp2) | 0;\n }\n\n h0 = (h0 + a) | 0; h1 = (h1 + b) | 0;\n h2 = (h2 + c) | 0; h3 = (h3 + d) | 0;\n h4 = (h4 + e) | 0; h5 = (h5 + f) | 0;\n h6 = (h6 + g) | 0; h7 = (h7 + h) | 0;\n }\n\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, h0, false); outView.setUint32(4, h1, false);\n outView.setUint32(8, h2, false); outView.setUint32(12, h3, false);\n outView.setUint32(16, h4, false); outView.setUint32(20, h5, false);\n outView.setUint32(24, h6, false); outView.setUint32(28, h7, false);\n return out;\n}\n\nexport function sha256Hex(input: string): string {\n return Array.from(sha256(input))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n","// ═══════════════════════════════════════════════════════════════\n// SolNames v1 — Word Lists & Constants\n// 1000 adjectives × 1000 nouns = 1,000,000 display name combos.\n// All words are positive or neutral. No negative, offensive, or\n// embarrassing terms. PascalCase words, space-separated in output.\n// ═══════════════════════════════════════════════════════════════\n\nexport const SOLNAMES_VERSION = \"v1\" as const;\n\nexport type NameFormat = \"short\" | \"display\" | \"tag\" | \"full\";\n\nexport interface SolNameIdentity {\n short: string;\n name: string;\n tag: string;\n full: string;\n adjective: string;\n noun: string;\n hash: string;\n discriminator: string;\n}\n\n// ─── Adjectives (1000) ──────────────────────────────────────────\nexport const ADJECTIVES: readonly string[] = Object.freeze([\n \"Frost\",\"Solar\",\"Coral\",\"Amber\",\"Mossy\",\"Lunar\",\"Misty\",\"Alpine\",\n \"Autumn\",\"Breeze\",\"Cerulean\",\"Cloudy\",\"Cosmic\",\"Crystal\",\"Dewy\",\"Dusty\",\n \"Earthy\",\"Floral\",\"Forest\",\"Frozen\",\"Glacial\",\"Golden\",\"Grassy\",\"Harbor\",\n \"Ivory\",\"Jasmine\",\"Lagoon\",\"Leafy\",\"Lush\",\"Marine\",\"Meadow\",\"Mineral\",\n \"Mosaic\",\"Nectar\",\"Nordic\",\"Oceanic\",\"Orchid\",\"Pearly\",\"Petal\",\"Polar\",\n \"Prairie\",\"Rain\",\"River\",\"Rocky\",\"Sandy\",\"Savanna\",\"Shore\",\"Sierra\",\n \"Snowy\",\"Spring\",\"Starry\",\"Stone\",\"Summer\",\"Sunset\",\"Tidal\",\"Timber\",\n \"Tropic\",\"Tundra\",\"Valley\",\"Verdant\",\"Winding\",\"Winter\",\"Woody\",\"Bloom\",\n \"Blossom\",\"Brook\",\"Canyon\",\"Cedar\",\"Cloud\",\"Comet\",\"Copper\",\"Dawn\",\n \"Delta\",\"Dune\",\"Eclipse\",\"Fern\",\"Flame\",\"Flora\",\"Glade\",\"Azure\",\n \"Cobalt\",\"Crimson\",\"Indigo\",\"Scarlet\",\"Sapphire\",\"Emerald\",\"Ruby\",\"Garnet\",\n \"Onyx\",\"Jade\",\"Turquoise\",\"Magenta\",\"Plum\",\"Russet\",\"Tawny\",\"Burnt\",\n \"Gilded\",\"Platinum\",\"Bronze\",\"Chrome\",\"Pearl\",\"Opal\",\"Blush\",\"Rosy\",\n \"Dusky\",\"Inky\",\"Ashen\",\"Cream\",\"Slate\",\"Charcoal\",\"Steel\",\"Pewter\",\n \"Honey\",\"Saffron\",\"Citrus\",\"Lemon\",\"Tangerine\",\"Peach\",\"Apricot\",\"Vermilion\",\n \"Mauve\",\"Lilac\",\"Periwinkle\",\"Cerise\",\"Maroon\",\"Burgundy\",\"Wine\",\"Berry\",\n \"Cherry\",\"Mint\",\"Olive\",\"Teal\",\"Navy\",\"Cyan\",\"Neon\",\"Pastel\",\n \"Muted\",\"Lustrous\",\"Gleaming\",\"Glossy\",\"Shining\",\"Glowing\",\"Luminous\",\"Brilliant\",\n \"Sparkling\",\"Shimmering\",\"Iridescent\",\"Prismatic\",\"Spectral\",\"Twilight\",\"Sunrise\",\"Sunlit\",\n \"Moonlit\",\"Starlit\",\"Candlelit\",\"Firelit\",\"Sunbeam\",\"Afterglow\",\"Halo\",\"Flicker\",\n \"Glow\",\"Ray\",\"Beam\",\"Blaze\",\"Glint\",\"Spark\",\"Arc\",\"Prism\",\n \"Spectrum\",\"Rainbow\",\"Aurora\",\"Nebula\",\"Stellar\",\"Astral\",\"Lucent\",\"Frosted\",\n \"Swift\",\"Bold\",\"Keen\",\"Brave\",\"Noble\",\"Serene\",\"Fierce\",\"Gentle\",\n \"Agile\",\"Alert\",\"Astute\",\"Candid\",\"Clever\",\"Daring\",\"Eager\",\"Earnest\",\n \"Fair\",\"Gallant\",\"Graceful\",\"Hardy\",\"Honest\",\"Humble\",\"Jovial\",\"Joyful\",\n \"Kind\",\"Loyal\",\"Merry\",\"Mindful\",\"Nimble\",\"Patient\",\"Plucky\",\"Proud\",\n \"Quick\",\"Ready\",\"Resilient\",\"Savvy\",\"Sincere\",\"Skilled\",\"Steady\",\"Stout\",\n \"Strong\",\"Sure\",\"Tender\",\"True\",\"Valiant\",\"Willing\",\"Wise\",\"Witty\",\n \"Worthy\",\"Zealous\",\"Active\",\"Adept\",\"Ardent\",\"Avid\",\"Benign\",\"Bright\",\n \"Civil\",\"Clean\",\"Clear\",\"Composed\",\"Content\",\"Courtly\",\"Crafty\",\"Curious\",\n \"Decent\",\"Devout\",\"Diligent\",\"Direct\",\"Driven\",\"Dynamic\",\"Elegant\",\"Elite\",\n \"Even\",\"Exact\",\"Famed\",\"Fervent\",\"Fine\",\"Firm\",\"Fit\",\"Fluid\",\n \"Focal\",\"Fond\",\"Frank\",\"Free\",\"Fresh\",\"Friendly\",\"Frugal\",\"Gifted\",\n \"Glad\",\"Grand\",\"Great\",\"Green\",\"Grounded\",\"Hale\",\"Happy\",\"Hearty\",\n \"Heroic\",\"Ideal\",\"Infinite\",\"Inner\",\"Intact\",\"Intent\",\"Just\",\"Lively\",\n \"Lucky\",\"Major\",\"Mellow\",\"Mighty\",\"Modest\",\"Natural\",\"Neat\",\"Optimal\",\n \"Original\",\"Pacific\",\"Peaceful\",\"Pious\",\"Pleased\",\"Poised\",\"Polite\",\"Popular\",\n \"Potent\",\"Precious\",\"Premier\",\"Prime\",\"Proper\",\"Proven\",\"Pure\",\"Quiet\",\n \"Rapid\",\"Rare\",\"Real\",\"Regal\",\"Rich\",\"Rising\",\"Robust\",\"Royal\",\n \"Sacred\",\"Safe\",\"Scenic\",\"Secure\",\"Senior\",\"Sharp\",\"Simple\",\"Smart\",\n \"Smooth\",\"Snug\",\"Social\",\"Solid\",\"Sound\",\"Special\",\"Stable\",\"Stately\",\n \"Still\",\"Super\",\"Supreme\",\"Sweet\",\"Thorough\",\"Tidy\",\"Top\",\"Total\",\n \"Tough\",\"Trim\",\"Trusted\",\"Ultimate\",\"Unique\",\"United\",\"Upper\",\"Useful\",\n \"Valid\",\"Valued\",\"Varied\",\"Vital\",\"Vivid\",\"Vocal\",\"Whole\",\"Wide\",\n \"Young\",\"Zesty\",\"Iron\",\"Gold\",\"Silver\",\"Marble\",\"Granite\",\"Velvet\",\n \"Satin\",\"Silk\",\"Linen\",\"Cotton\",\"Suede\",\"Denim\",\"Canvas\",\"Leather\",\n \"Wooden\",\"Bamboo\",\"Wicker\",\"Woven\",\"Braided\",\"Knit\",\"Lace\",\"Mesh\",\n \"Fiber\",\"Glass\",\"Mirror\",\"Diamond\",\"Flint\",\"Basalt\",\"Obsidian\",\"Chalk\",\n \"Clay\",\"Gravel\",\"Pebble\",\"Cobble\",\"Brick\",\"Tile\",\"Resin\",\"Fossil\",\n \"Shell\",\"Bone\",\"Feather\",\"Plush\",\"Brushed\",\"Polished\",\"Hammered\",\"Forged\",\n \"Cast\",\"Molten\",\"Tempered\",\"Etched\",\"Carved\",\"Sculpted\",\"Spun\",\"Pressed\",\n \"Rolled\",\"Folded\",\"Layered\",\"Stacked\",\"Ribbed\",\"Matte\",\"Lacquered\",\"Enameled\",\n \"Glazed\",\"Painted\",\"Dyed\",\"Stained\",\"Refined\",\"Distilled\",\"Purified\",\"Filtered\",\n \"Alloyed\",\"Plated\",\"Coated\",\"Sealed\",\"Bonded\",\"Fused\",\"Welded\",\"Riveted\",\n \"Textured\",\"Grained\",\"Veined\",\"Flecked\",\"Speckled\",\"Dappled\",\"Streaked\",\"Banded\",\n \"Striped\",\"Checkered\",\"Waxed\",\"Oiled\",\"Cured\",\"Tanned\",\"Smoked\",\"Burnished\",\n \"Antiqued\",\"Patina\",\"Weathered\",\"Aged\",\"Rustic\",\"Hewn\",\"Vast\",\"Broad\",\n \"Deep\",\"High\",\"Tall\",\"Giant\",\"Colossal\",\"Massive\",\"Immense\",\"Boundless\",\n \"Endless\",\"Sweeping\",\"Spanning\",\"Extended\",\"Towering\",\"Soaring\",\"Lofty\",\"Elevated\",\n \"Raised\",\"Summit\",\"Apex\",\"Crest\",\"Crown\",\"Pinnacle\",\"Zenith\",\"Ridge\",\n \"Ledge\",\"Level\",\"Hollow\",\"Compact\",\"Dense\",\"Thick\",\"Narrow\",\"Slender\",\n \"Micro\",\"Mini\",\"Small\",\"Ample\",\"Hefty\",\"Jumbo\",\"Mega\",\"Ultra\",\n \"Macro\",\"Central\",\"Core\",\"Outer\",\"Lateral\",\"Radial\",\"Spiral\",\"Orbital\",\n \"Linear\",\"Planar\",\"Spherical\",\"Rounded\",\"Angular\",\"Pointed\",\"Tapered\",\"Curved\",\n \"Arced\",\"Twisted\",\"Coiled\",\"Fractal\",\"Cellular\",\"Quantum\",\"Photon\",\"Plasma\",\n \"Kinetic\",\"Static\",\"Charged\",\"Maximal\",\"Atomic\",\"Nano\",\"Tiered\",\"Strata\",\n \"Nested\",\"Stepped\",\"Graded\",\"Scaled\",\"Proportioned\",\"Modular\",\"Symmetric\",\"Parallel\",\n \"Flowing\",\"Drifting\",\"Gliding\",\"Sailing\",\"Floating\",\"Climbing\",\"Leaping\",\"Bounding\",\n \"Sprinting\",\"Dashing\",\"Rushing\",\"Surging\",\"Cascading\",\"Rolling\",\"Tumbling\",\"Spinning\",\n \"Whirling\",\"Twisting\",\"Swirling\",\"Pulsing\",\"Beating\",\"Humming\",\"Buzzing\",\"Ringing\",\n \"Chiming\",\"Singing\",\"Dancing\",\"Swaying\",\"Waving\",\"Rippling\",\"Bubbling\",\"Fizzing\",\n \"Crackling\",\"Snapping\",\"Clicking\",\"Tapping\",\"Drumming\",\"Thrumming\",\"Vibrant\",\"Magnetic\",\n \"Electric\",\"Blazing\",\"Burning\",\"Fiery\",\"Volcanic\",\"Thermal\",\"Warming\",\"Cooling\",\n \"Chilling\",\"Brisk\",\"Crisp\",\"Breezy\",\"Gusty\",\"Windy\",\"Airy\",\"Light\",\n \"Buoyant\",\"Weightless\",\"Fleet\",\"Peppy\",\"Zippy\",\"Snappy\",\"Speedy\",\"Sonic\",\n \"Turbo\",\"Warp\",\"Express\",\"Instant\",\"Darting\",\"Flying\",\"Jetting\",\"Cruising\",\n \"Coasting\",\"Rhythmic\",\"Cycling\",\"Pacing\",\"Striding\",\"Marching\",\"Trotting\",\"Galloping\",\n \"Bouncing\",\"Vaulting\",\"Arching\",\"Launched\",\"Propelled\",\"Hovering\",\"Orbiting\",\"Revolving\",\n \"Rotating\",\"Pivoting\",\"Swinging\",\"Rocking\",\"Tilting\",\"Shifting\",\"Sliding\",\"Skating\",\n \"Surfing\",\"Diving\",\"Plunging\",\"Dipping\",\"Wading\",\"Celestial\",\"Ethereal\",\"Mystic\",\n \"Arcane\",\"Ancient\",\"Eternal\",\"Timeless\",\"Ageless\",\"Enduring\",\"Lasting\",\"Perpetual\",\n \"Legendary\",\"Mythic\",\"Epic\",\"Fabled\",\"Storied\",\"Historic\",\"Classic\",\"Vintage\",\n \"Retro\",\"Modern\",\"Future\",\"Digital\",\"Cyber\",\"Virtual\",\"Pixel\",\"Binary\",\n \"Omega\",\"Alpha\",\"Beta\",\"Gamma\",\"Sigma\",\"Theta\",\"Lambda\",\"Kappa\",\n \"Zeta\",\"Epsilon\",\"Omni\",\"Dual\",\"Triple\",\"Nexus\",\"Vertex\",\"Vector\",\n \"Matrix\",\"Cipher\",\"Enigma\",\"Phantom\",\"Mirage\",\"Dream\",\"Vision\",\"Oracle\",\n \"Prophet\",\"Sage\",\"Shaman\",\"Druid\",\"Artisan\",\"Maestro\",\"Virtuoso\",\"Savant\",\n \"Prodigy\",\"Maven\",\"Guru\",\"Mentor\",\"Guide\",\"Scout\",\"Pioneer\",\"Voyager\",\n \"Wanderer\",\"Nomad\",\"Rover\",\"Ranger\",\"Sentinel\",\"Guardian\",\"Keeper\",\"Warden\",\n \"Champion\",\"Vanguard\",\"Herald\",\"Emissary\",\"Envoy\",\"Ambassador\",\"Steward\",\"Curator\",\n \"Patron\",\"Benefactor\",\"Founder\",\"Architect\",\"Builder\",\"Maker\",\"Crafter\",\"Weaver\",\n \"Forger\",\"Smith\",\"Wright\",\"Mason\",\"Brewer\",\"Baker\",\"Tanner\",\"Dyer\",\n \"Scribe\",\"Bard\",\"Minstrel\",\"Troubadour\",\"Storyteller\",\"Chronicler\",\"Lorekeeper\",\"Archivist\",\n \"Tranquil\",\"Placid\",\"Hushed\",\"Muffled\",\"Soft\",\"Subtle\",\"Faint\",\"Dim\",\n \"Pale\",\"Warm\",\"Cool\",\"Taut\",\"Tense\",\"Cozy\",\"Homey\",\"Pastoral\",\n \"Sylvan\",\"Bucolic\",\"Idyllic\",\"Quaint\",\"Charming\",\"Lovely\",\"Pretty\",\"Dapper\",\n \"Natty\",\"Chic\",\"Posh\",\"Classy\",\"Fancy\",\"Ornate\",\"Lavish\",\"Opulent\",\n \"Majestic\",\"Dignified\",\"August\",\"Solemn\",\"Sober\",\"Heartfelt\",\"Genuine\",\"Authentic\",\n \"Novel\",\"Singular\",\"Distinct\",\"Chosen\",\"Select\",\"Premium\",\"Deluxe\",\"Superior\",\n \"Exquisite\",\"Superb\",\"Splendid\",\"Glorious\",\"Sublime\",\"Resonant\",\"Harmonic\",\"Melodic\",\n \"Lyrical\",\"Poetic\",\"Seamless\",\"Effortless\",\"Organic\",\"Primal\",\"Devoted\",\"Dedicated\",\n \"Committed\",\"Focused\",\"Determined\",\"Resolute\",\"Steadfast\",\"Unwavering\",\"Constant\",\"Faithful\",\n \"Reliable\",\"Dependable\",\"Trusty\",\"Anchored\",\"Moored\",\"Sheltered\",\"Protected\",\"Guarded\",\n \"Shielded\",\"Fortified\",\"Reinforced\",\"Braced\",\"Bolstered\",\"Supported\",\"Upheld\",\"Sustained\",\n \"Preserved\",\"Conserved\",\"Stored\",\"Vaulted\",\"Locked\",\"Secured\",\"Fastened\",\"Linked\",\n \"Joined\",\"Connected\",\"Paired\",\"Matched\",\"Balanced\",\"Aligned\",\"Centered\",\"Aimed\",\n \"Directed\",\"Guided\",\"Steered\",\"Piloted\",\"Navigated\",\"Charted\",\"Mapped\",\"Tracked\",\n \"Pursued\",\"Discovered\",\"Unveiled\",\"Displayed\",\"Presented\",\"Granted\",\"Bestowed\",\"Conferred\",\n \"Sapient\",\"Sentient\",\"Radiant\",\"Fertile\",\"Abundant\",\"Bountiful\",\"Plentiful\",\"Prolific\",\n \"Thriving\",\"Flourishing\",\"Blooming\",\"Budding\",\"Growing\",\"Expanding\",\"Advancing\",\"Progressing\",\n \"Evolving\",\"Maturing\",\"Ripening\",\"Developing\",\"Emerging\",\"Nascent\",\"Incipient\",\"Dawning\",\n \"Unfolding\",\"Awakening\",\"Stirring\",\"Kindling\",\"Igniting\",\"Sparking\",\"Triggering\",\"Launching\",\n \"Initiating\",\"Pioneering\",\"Trailblazing\",\"Groundbreaking\",\"Innovative\",\"Inventive\",\"Creative\",\"Imaginative\",\n \"Inspired\",\"Visionary\",\"Prophetic\",\"Prescient\",\"Insightful\",\"Perceptive\",\"Observant\",\"Watchful\",\n \"Vigilant\",\"Attentive\",\"Thoughtful\",\"Considerate\",\"Caring\",\"Nurturing\",\"Fostering\",\"Cultivating\",\n \"Tending\",\"Pruning\",\"Trimming\",\"Shaping\",\"Forming\",\"Molding\",\"Fashioning\",\"Designing\",\n \"Drafting\",\"Sketching\",\"Drawing\",\"Painting\",\"Coloring\",\"Tinting\",\"Shading\",\"Blending\",\n \"Mixing\",\"Merging\",\"Combining\",\"Uniting\",\"Fusing\",\"Melding\",\"Weaving\",\"Knitting\",\n \"Stitching\",\"Sewing\",\"Quilting\",\"Patching\",\"Mending\",\"Healing\",\"Restoring\",\"Renewing\",\n \"Reviving\",\"Refreshing\",\"Rejuvenating\",\"Invigorating\",\"Energizing\",\"Empowering\",\"Strengthening\",\"Fortifying\",\n \"Hardening\",\"Tempering\",\"Seasoning\",\"Curing\",\"Aging\",\"Mellowing\",\"Softening\",\"Smoothing\",\n \"Leveling\",\"Planing\",\"Sanding\",\"Buffing\",\"Burnishing\",\"Radiating\",\"Beaming\",\"Lighting\",\n \"Illuminating\",\"Brightening\",\"Clarifying\",\"Purifying\",\"Filtering\",\"Distilling\",\"Condensing\",\"Concentrating\",\n \"Focusing\",\"Directing\",\"Channeling\",\"Terraced\",\"Ascending\",\"Streaming\",\"Umber\",\"Careful\",\n \"Perfecting\",\"Glittering\",\"Twinkling\",\"Verdure\",\"Auroral\",\"Boreal\",\"Austral\",\"Temperate\",\n]);\n\n// ─── Nouns (1000) ───────────────────────────────────────────────\nexport const NOUNS: readonly string[] = Object.freeze([\n \"Falcon\",\"Hawk\",\"Eagle\",\"Owl\",\"Heron\",\"Crane\",\"Swan\",\"Dove\",\n \"Raven\",\"Finch\",\"Robin\",\"Wren\",\"Lark\",\"Jay\",\"Ibis\",\"Kite\",\n \"Osprey\",\"Condor\",\"Pelican\",\"Stork\",\"Sparrow\",\"Tern\",\"Puffin\",\"Parrot\",\n \"Toucan\",\"Kingfisher\",\"Flamingo\",\"Quail\",\"Pheasant\",\"Grouse\",\"Oriole\",\"Warbler\",\n \"Thrush\",\"Starling\",\"Magpie\",\"Swallow\",\"Martin\",\"Plover\",\"Curlew\",\"Sandpiper\",\n \"Wolf\",\"Fox\",\"Bear\",\"Stag\",\"Elk\",\"Moose\",\"Bison\",\"Lynx\",\n \"Cougar\",\"Panther\",\"Jaguar\",\"Leopard\",\"Tiger\",\"Lion\",\"Cheetah\",\"Gazelle\",\n \"Antelope\",\"Impala\",\"Zebra\",\"Giraffe\",\"Rhino\",\"Hippo\",\"Otter\",\"Beaver\",\n \"Badger\",\"Marten\",\"Ferret\",\"Mink\",\"Hare\",\"Rabbit\",\"Squirrel\",\"Chipmunk\",\n \"Porcupine\",\"Hedgehog\",\"Armadillo\",\"Pangolin\",\"Lemur\",\"Gibbon\",\"Tamarin\",\"Capybara\",\n \"Chinchilla\",\"Ocelot\",\"Margay\",\"Coati\",\"Kinkajou\",\"Tapir\",\"Okapi\",\"Kudu\",\n \"Oryx\",\"Chamois\",\"Orca\",\"Dolphin\",\"Whale\",\"Narwhal\",\"Walrus\",\"Seal\",\n \"Manatee\",\"Turtle\",\"Iguana\",\"Gecko\",\"Chameleon\",\"Newt\",\"Salamander\",\"Crab\",\n \"Lobster\",\"Seahorse\",\"Starfish\",\"Octopus\",\"Squid\",\"Jellyfish\",\"Stingray\",\"Barracuda\",\n \"Marlin\",\"Sailfish\",\"Trout\",\"Salmon\",\"Mantis\",\"Cricket\",\"Firefly\",\"Dragonfly\",\n \"Cedar\",\"Oak\",\"Pine\",\"Birch\",\"Maple\",\"Elm\",\"Ash\",\"Willow\",\n \"Cypress\",\"Redwood\",\"Sequoia\",\"Spruce\",\"Fir\",\"Larch\",\"Yew\",\"Beech\",\n \"Alder\",\"Poplar\",\"Aspen\",\"Walnut\",\"Hickory\",\"Teak\",\"Mahogany\",\"Ebony\",\n \"Bamboo\",\"Palm\",\"Acacia\",\"Baobab\",\"Banyan\",\"Olive\",\"Laurel\",\"Magnolia\",\n \"Lotus\",\"Orchid\",\"Iris\",\"Lily\",\"Rose\",\"Tulip\",\"Daisy\",\"Aster\",\n \"Dahlia\",\"Peony\",\"Jasmine\",\"Violet\",\"Clover\",\"Fern\",\"Moss\",\"Lichen\",\n \"Ivy\",\"Vine\",\"Reed\",\"Sage\",\"Basil\",\"Thyme\",\"Mint\",\"Dill\",\n \"Fennel\",\"Sorrel\",\"Yarrow\",\"Thistle\",\"Heather\",\"Bluebell\",\"Primrose\",\"Marigold\",\n \"Sunflower\",\"Zinnia\",\"Pansy\",\"Poppy\",\"Crocus\",\"Snowdrop\",\"Foxglove\",\"Honeysuckle\",\n \"Wisteria\",\"Hibiscus\",\"Plumeria\",\"Gardenia\",\"Camellia\",\"Begonia\",\"Azalea\",\"Oleander\",\n \"Canyon\",\"Ridge\",\"Peak\",\"Summit\",\"Cliff\",\"Bluff\",\"Mesa\",\"Butte\",\n \"Plateau\",\"Terrace\",\"Valley\",\"Basin\",\"Gorge\",\"Ravine\",\"Gulch\",\"Fjord\",\n \"Inlet\",\"Bay\",\"Cove\",\"Harbor\",\"Lagoon\",\"Reef\",\"Atoll\",\"Isle\",\n \"Peninsula\",\"Cape\",\"Shoal\",\"Bank\",\"Ledge\",\"Shelf\",\"Dune\",\"Desert\",\n \"Steppe\",\"Tundra\",\"Glacier\",\"Moraine\",\"Geyser\",\"Oasis\",\"Delta\",\"Estuary\",\n \"Marsh\",\"Bog\",\"Swamp\",\"Fen\",\"Moor\",\"Heath\",\"Meadow\",\"Prairie\",\n \"Savanna\",\"Glen\",\"Dale\",\"Dell\",\"Vale\",\"Hollow\",\"Grove\",\"Copse\",\n \"Thicket\",\"Taiga\",\"Mangrove\",\"Wetland\",\"Cascade\",\"Brook\",\"Creek\",\"Stream\",\n \"River\",\"Lake\",\"Pond\",\"Pool\",\"Tarn\",\"Loch\",\"Falls\",\"Fountain\",\n \"Grotto\",\"Cavern\",\"Cave\",\"Tunnel\",\"Arch\",\"Bridge\",\"Ford\",\"Pass\",\n \"Trail\",\"Path\",\"Route\",\"Caldera\",\"Crater\",\"Vent\",\"Spire\",\"Needle\",\n \"Dome\",\"Gateway\",\"Portal\",\"Threshold\",\"Verge\",\"Brink\",\"Edge\",\"Rim\",\n \"Brow\",\"Crest\",\"Promontory\",\"Headland\",\"Spit\",\"Tombolo\",\"Isthmus\",\"Strait\",\n \"Narrows\",\"Sound\",\"Bight\",\"Reach\",\"Stretch\",\"Expanse\",\"Clearing\",\"Glade\",\n \"Knoll\",\"Hillock\",\"Mound\",\"Tor\",\"Crag\",\"Scarp\",\"Escarpment\",\"Comet\",\n \"Meteor\",\"Asteroid\",\"Nebula\",\"Galaxy\",\"Quasar\",\"Pulsar\",\"Star\",\"Sun\",\n \"Moon\",\"Planet\",\"Orbit\",\"Eclipse\",\"Corona\",\"Flare\",\"Nova\",\"Cosmos\",\n \"Void\",\"Abyss\",\"Ether\",\"Zenith\",\"Nadir\",\"Horizon\",\"Aurora\",\"Meridian\",\n \"Equinox\",\"Solstice\",\"Phase\",\"Cycle\",\"Epoch\",\"Eon\",\"Era\",\"Dawn\",\n \"Dusk\",\"Twilight\",\"Night\",\"Noon\",\"Morning\",\"Evening\",\"Sunset\",\"Sunrise\",\n \"Daybreak\",\"Nightfall\",\"Starlight\",\"Moonbeam\",\"Sunray\",\"Skyline\",\"Firmament\",\"Canopy\",\n \"Infinity\",\"Vega\",\"Rigel\",\"Altair\",\"Deneb\",\"Sirius\",\"Polaris\",\"Arcturus\",\n \"Antares\",\"Lyra\",\"Orion\",\"Draco\",\"Phoenix\",\"Hydra\",\"Corvus\",\"Cygnus\",\n \"Aquila\",\"Andromeda\",\"Pegasus\",\"Perseus\",\"Gemini\",\"Centauri\",\"Cassiopeia\",\"Scorpius\",\n \"Sagittarius\",\"Capella\",\"Procyon\",\"Aldebaran\",\"Betelgeuse\",\"Spica\",\"Prism\",\"Quill\",\n \"Forge\",\"Anvil\",\"Helm\",\"Rune\",\"Atlas\",\"Compass\",\"Anchor\",\"Beacon\",\n \"Bell\",\"Bugle\",\"Drum\",\"Flute\",\"Harp\",\"Horn\",\"Lyre\",\"Pipe\",\n \"Gong\",\"Chime\",\"Cymbal\",\"Fiddle\",\"Trumpet\",\"Viola\",\"Cello\",\"Oboe\",\n \"Lute\",\"Mandolin\",\"Zither\",\"Sitar\",\"Banjo\",\"Lantern\",\"Torch\",\"Candle\",\n \"Lamp\",\"Globe\",\"Lens\",\"Scope\",\"Mirror\",\"Frame\",\"Easel\",\"Palette\",\n \"Brush\",\"Chisel\",\"Mallet\",\"Hammer\",\"Tongs\",\"Ladle\",\"Kettle\",\"Crucible\",\n \"Mortar\",\"Pestle\",\"Flask\",\"Vial\",\"Beaker\",\"Alembic\",\"Furnace\",\"Kiln\",\n \"Loom\",\"Shuttle\",\"Bobbin\",\"Spool\",\"Thimble\",\"Pin\",\"Clasp\",\"Buckle\",\n \"Brooch\",\"Pendant\",\"Amulet\",\"Talisman\",\"Charm\",\"Token\",\"Coin\",\"Medal\",\n \"Badge\",\"Shield\",\"Banner\",\"Flag\",\"Pennant\",\"Sigil\",\"Stamp\",\"Emblem\",\n \"Totem\",\"Icon\",\"Statue\",\"Obelisk\",\"Monolith\",\"Cairn\",\"Tablet\",\"Scroll\",\n \"Tome\",\"Codex\",\"Ledger\",\"Journal\",\"Chronicle\",\"Almanac\",\"Manual\",\"Gazette\",\n \"Folio\",\"Pamphlet\",\"Broadsheet\",\"Parchment\",\"Vellum\",\"Papyrus\",\"Inkwell\",\"Quiver\",\n \"Satchel\",\"Pouch\",\"Casket\",\"Coffer\",\"Chest\",\"Crate\",\"Barrel\",\"Quartz\",\n \"Opal\",\"Onyx\",\"Agate\",\"Garnet\",\"Topaz\",\"Beryl\",\"Zircon\",\"Spinel\",\n \"Peridot\",\"Jasper\",\"Amethyst\",\"Citrine\",\"Tourmaline\",\"Malachite\",\"Azurite\",\"Lapis\",\n \"Pyrite\",\"Galena\",\"Mica\",\"Talc\",\"Gypsum\",\"Calcite\",\"Dolomite\",\"Basalt\",\n \"Granite\",\"Marble\",\"Slate\",\"Shale\",\"Sandstone\",\"Limestone\",\"Obsidian\",\"Pumice\",\n \"Tuff\",\"Chert\",\"Flint\",\"Chalcedony\",\"Carnelian\",\"Sardonyx\",\"Moonstone\",\"Sunstone\",\n \"Labradorite\",\"Tanzanite\",\"Kunzite\",\"Rhodonite\",\"Sodalite\",\"Chrysocolla\",\"Aventurine\",\"Fluorite\",\n \"Seraphinite\",\"Charoite\",\"Sugilite\",\"Larimar\",\"Prehnite\",\"Danburite\",\"Scolecite\",\"Celestite\",\n \"Amazonite\",\"Howlite\",\"Lepidolite\",\"Storm\",\"Thunder\",\"Lightning\",\"Breeze\",\"Gale\",\n \"Squall\",\"Typhoon\",\"Cyclone\",\"Monsoon\",\"Tempest\",\"Zephyr\",\"Chinook\",\"Mistral\",\n \"Sirocco\",\"Foehn\",\"Bora\",\"Rain\",\"Drizzle\",\"Shower\",\"Downpour\",\"Deluge\",\n \"Flood\",\"Torrent\",\"Current\",\"Tide\",\"Wave\",\"Swell\",\"Surf\",\"Spray\",\n \"Foam\",\"Mist\",\"Fog\",\"Haze\",\"Dew\",\"Frost\",\"Ice\",\"Snow\",\n \"Sleet\",\"Hail\",\"Rime\",\"Thaw\",\"Flow\",\"Drift\",\"Eddy\",\"Vortex\",\n \"Whirl\",\"Spiral\",\"Funnel\",\"Column\",\"Plume\",\"Wisp\",\"Streak\",\"Band\",\n \"Front\",\"Trough\",\"Rainbow\",\"Halo\",\"Mirage\",\"Shimmer\",\"Glimmer\",\"Tower\",\n \"Turret\",\"Bastion\",\"Citadel\",\"Fortress\",\"Castle\",\"Palace\",\"Manor\",\"Lodge\",\n \"Cabin\",\"Cottage\",\"Villa\",\"Ranch\",\"Barn\",\"Silo\",\"Mill\",\"Foundry\",\n \"Workshop\",\"Studio\",\"Gallery\",\"Museum\",\"Library\",\"Archive\",\"Treasury\",\"Vault\",\n \"Chamber\",\"Hall\",\"Court\",\"Plaza\",\"Garden\",\"Balcony\",\"Porch\",\"Arcade\",\n \"Colonnade\",\"Pergola\",\"Pavilion\",\"Gazebo\",\"Kiosk\",\"Chapel\",\"Temple\",\"Shrine\",\n \"Monastery\",\"Abbey\",\"Cathedral\",\"Basilica\",\"Minaret\",\"Pagoda\",\"Stupa\",\"Pyramid\",\n \"Arena\",\"Stadium\",\"Forum\",\"Market\",\"Bazaar\",\"Emporium\",\"Depot\",\"Station\",\n \"Terminal\",\"Dock\",\"Wharf\",\"Pier\",\"Jetty\",\"Quay\",\"Marina\",\"Lighthouse\",\n \"Watchtower\",\"Outpost\",\"Camp\",\"Shelter\",\"Refuge\",\"Sanctuary\",\"Haven\",\"Retreat\",\n \"Nest\",\"Aerie\",\"Burrow\",\"Den\",\"Lair\",\"Roost\",\"Perch\",\"Bower\",\n \"Arbor\",\"Alcove\",\"Sextant\",\"Astrolabe\",\"Sundial\",\"Hourglass\",\"Pendulum\",\"Gyroscope\",\n \"Turbine\",\"Dynamo\",\"Generator\",\"Piston\",\"Valve\",\"Lever\",\"Pulley\",\"Winch\",\n \"Derrick\",\"Gantry\",\"Scaffold\",\"Trellis\",\"Lattice\",\"Grid\",\"Net\",\"Web\",\n \"Axle\",\"Gear\",\"Cog\",\"Sprocket\",\"Chain\",\"Link\",\"Cable\",\"Wire\",\n \"Thread\",\"Cord\",\"Rope\",\"Rigging\",\"Mast\",\"Boom\",\"Spar\",\"Keel\",\n \"Hull\",\"Rudder\",\"Tiller\",\"Wheel\",\"Chart\",\"Map\",\"Gauge\",\"Meter\",\n \"Scale\",\"Caliper\",\"Ruler\",\"Level\",\"Plumb\",\"Protractor\",\"Template\",\"Stencil\",\n \"Mold\",\"Die\",\"Lathe\",\"Bellows\",\"Retort\",\"Condenser\",\"Centrifuge\",\"Spectrometer\",\n \"Oscilloscope\",\"Theodolite\",\"Transit\",\"Sounding\",\"Probe\",\"Sensor\",\"Relay\",\"Switch\",\n \"Circuit\",\"Diode\",\"Quest\",\"Saga\",\"Legend\",\"Myth\",\"Fable\",\"Ballad\",\n \"Anthem\",\"Hymn\",\"Ode\",\"Sonnet\",\"Verse\",\"Stanza\",\"Canto\",\"Chorus\",\n \"Refrain\",\"Motif\",\"Theme\",\"Arc\",\"Prologue\",\"Epilogue\",\"Prelude\",\"Overture\",\n \"Finale\",\"Crescendo\",\"Cadence\",\"Tempo\",\"Rhythm\",\"Pulse\",\"Beat\",\"Tone\",\n \"Note\",\"Chord\",\"Harmony\",\"Melody\",\"Lyric\",\"Opus\",\"Suite\",\"Etude\",\n \"Fugue\",\"Canon\",\"March\",\"Waltz\",\"Rondo\",\"Aria\",\"Duet\",\"Trio\",\n \"Quartet\",\"Ensemble\",\"Guild\",\"League\",\"Order\",\"Council\",\"Assembly\",\"Conclave\",\n \"Synod\",\"Quorum\",\"Cohort\",\"Legion\",\"Brigade\",\"Battalion\",\"Regiment\",\"Division\",\n \"Corps\",\"Fleet\",\"Squadron\",\"Patrol\",\"Convoy\",\"Caravan\",\"Expedition\",\"Voyage\",\n \"Journey\",\"Trek\",\"Odyssey\",\"Passage\",\"Crossing\",\"Venture\",\"Enterprise\",\"Mission\",\n \"Campaign\",\"Crusade\",\"Pilgrimage\",\"Safari\",\"Sortie\",\"Foray\",\"Rally\",\"Charge\",\n \"Advance\",\"Concord\",\"Ember\",\"Blaze\",\"Inferno\",\"Pyre\",\"Spark\",\"Cinder\",\n \"Smoke\",\"Vapor\",\"Steam\",\"Nimbus\",\"Cumulus\",\"Cirrus\",\"Stratus\",\"Billow\",\n \"Puff\",\"Wake\",\"Ripple\",\"Surge\",\"Ebb\",\"Flux\",\"Gush\",\"Rush\",\n \"Spring\",\"Well\",\"Font\",\"Source\",\"Origin\",\"Root\",\"Seed\",\"Sprout\",\n \"Bud\",\"Bloom\",\"Petal\",\"Leaf\",\"Branch\",\"Limb\",\"Trunk\",\"Bark\",\n \"Grain\",\"Fiber\",\"Pulp\",\"Core\",\"Sap\",\"Resin\",\"Nectar\",\"Pollen\",\n \"Spore\",\"Frond\",\"Tendril\",\"Runner\",\"Shoot\",\"Stalk\",\"Stem\",\"Thorn\",\n \"Burr\",\"Cone\",\"Acorn\",\"Pinecone\",\"Nutshell\",\"Keystone\",\"Capstone\",\"Milestone\",\n \"Cornerstone\",\"Foundation\",\"Bedrock\",\"Pillar\",\"Buttress\",\"Parapet\",\"Battlement\",\"Barbican\",\n \"Gatehouse\",\"Drawbridge\",\"Portcullis\",\"Moat\",\"Stockade\",\"Palisade\",\"Bulwark\",\"Levee\",\n \"Embankment\",\"Causeway\",\"Aqueduct\",\"Viaduct\",\"Trestle\",\"Span\",\"Lintel\",\"Plinth\",\n \"Pedestal\",\"Dais\",\"Rostrum\",\"Podium\",\"Stage\",\"Platform\",\"Deck\",\"Landing\",\n \"Berth\",\"Channel\",\"Lock\",\"Weir\",\"Dam\",\"Spillway\",\"Flume\",\"Chute\",\n \"Sluice\",\"Nozzle\",\"Spout\",\"Faucet\",\"Cistern\",\"Wellspring\",\"Headwater\",\"Watershed\",\n \"Alluvium\",\"Loam\",\"Humus\",\"Peat\",\"Marl\",\"Silt\",\"Writ\",\"Clamp\",\n \"Eyepiece\",\"Traverse\",\"Stride\",\"Parley\",\"Char\",\"Trace\",\"Confluence\",\"Rampart\",\n]);\n\n// ─── Blocked Combinations ──────────────────────────────────────\n// Adjective+Noun pairs that form offensive or inappropriate words\n// when concatenated. Checked at derivation time; PRNG advances\n// deterministically to produce a clean replacement.\nexport const BLOCKED_COMBOS: ReadonlySet<string> = Object.freeze(\n new Set<string>([\n // Add any discovered offensive adj+noun combinations here.\n // Format: \"Adjective Noun\" (space-separated)\n ]),\n);\n","// ═══════════════════════════════════════════════════════════════\n// SolNames v1 — Name Derivation Engine\n// SHA-256(\"solnames-v1:\" + wallet) → PRNG → adjective + noun\n// ═══════════════════════════════════════════════════════════════\n\nimport { sha256, sha256Hex } from \"./sha256\";\nimport { ADJECTIVES, NOUNS, BLOCKED_COMBOS, SOLNAMES_VERSION } from \"./constants\";\nimport type { NameFormat, SolNameIdentity } from \"./constants\";\n\nfunction mulberry32(seed: number): () => number {\n let a = seed | 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nconst DOMAIN = `solnames-${SOLNAMES_VERSION}:`;\n\n/** Options for customizing name derivation. */\nexport interface DeriveOptions {\n /** Custom adjective word list (default: built-in 1000 adjectives) */\n adjectives?: readonly string[];\n /** Custom noun word list (default: built-in 1000 nouns) */\n nouns?: readonly string[];\n /** Custom blocked adjective+noun combinations (default: built-in set) */\n blockedCombos?: Set<string>;\n /** Custom domain prefix for SHA-256 hashing (default: \"solnames-v1\") */\n domain?: string;\n /** Separator between adjective and noun (default: \" \") */\n separator?: string;\n}\n\n/**\n * Derive a deterministic name from a Solana wallet address.\n *\n * @param wallet Base58 wallet address\n * @param format Name format (default: \"display\")\n * @param options Custom word lists, domain, or blocked combos\n * @returns Formatted name string\n */\nexport function deriveName(\n wallet: string,\n format: NameFormat = \"display\",\n options?: DeriveOptions,\n): string {\n const id = deriveIdentity(wallet, options);\n switch (format) {\n case \"short\":\n return id.short;\n case \"display\":\n return id.name;\n case \"tag\":\n return id.tag;\n case \"full\":\n return id.full;\n }\n}\n\n/**\n * Derive the full identity bundle for a wallet address.\n * Returns all four name formats plus component parts.\n */\nexport function deriveIdentity(\n wallet: string,\n options?: DeriveOptions,\n): SolNameIdentity {\n const adjectives = options?.adjectives ?? ADJECTIVES;\n const nouns = options?.nouns ?? NOUNS;\n const blocked = options?.blockedCombos ?? BLOCKED_COMBOS;\n const domain = options?.domain ? `${options.domain}:` : DOMAIN;\n\n const hash = sha256(domain + wallet);\n const hex = sha256Hex(domain + wallet);\n\n // Seed PRNG from first 4 bytes (big-endian)\n const seed =\n ((hash[0] << 24) | (hash[1] << 16) | (hash[2] << 8) | hash[3]) >>> 0;\n const rng = mulberry32(seed);\n\n // Pick first adj+noun pair, retrying if blocked\n let adj1 = adjectives[Math.floor(rng() * adjectives.length)];\n let noun1 = nouns[Math.floor(rng() * nouns.length)];\n while (blocked.has(adj1 + noun1)) {\n adj1 = adjectives[Math.floor(rng() * adjectives.length)];\n noun1 = nouns[Math.floor(rng() * nouns.length)];\n }\n\n // Pick second adj+noun pair for full format\n const adj2 = adjectives[Math.floor(rng() * adjectives.length)];\n const noun2 = nouns[Math.floor(rng() * nouns.length)];\n\n // Discriminator from bytes 8-9 (4 hex chars)\n const discriminator = hex.slice(16, 20);\n\n const sep = options?.separator ?? \" \";\n\n return {\n short: adj1,\n name: adj1 + sep + noun1,\n tag: adj1 + sep + noun1 + \"#\" + discriminator,\n full: adj1 + sep + noun1 + \"-\" + adj2 + sep + noun2,\n adjective: adj1,\n noun: noun1,\n hash: hex,\n discriminator,\n };\n}\n","// ═══════════════════════════════════════════════════════════════\n// Color math utilities for SolFaces v2\n// Shared by renderer.ts (string) and SolFace.tsx (React)\n// ═══════════════════════════════════════════════════════════════\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n \"#\" +\n [r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\")\n )\n .join(\"\")\n );\n}\n\nexport function darken(hex: string, pct = 0.12): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * (1 - pct), g * (1 - pct), b * (1 - pct));\n}\n\nexport function lighten(hex: string, pct = 0.15): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r + (255 - r) * pct, g + (255 - g) * pct, b + (255 - b) * pct);\n}\n\nexport function blend(a: string, b: string, t = 0.5): string {\n const [r1, g1, b1] = hexToRgb(a);\n const [r2, g2, b2] = hexToRgb(b);\n return rgbToHex(\n r1 + (r2 - r1) * t,\n g1 + (g2 - g1) * t,\n b1 + (b2 - b1) * t\n );\n}\n\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n return (r + g + b) / 3;\n}\n\nexport interface DerivedColors {\n skinHi: string;\n skinLo: string;\n skinMid: string;\n isDark: boolean;\n cheekColor: string;\n cheekOpacity: number;\n lipColor: string;\n noseFill: string;\n browColor: string;\n earFill: string;\n earShadow: string;\n eyeWhiteAdapted: string;\n lidColor: string;\n accessoryColor: string;\n}\n\nexport function deriveSkinColors(skin: string): DerivedColors {\n const sL = luminance(skin);\n const isDark = sL < 100;\n\n const skinHi = lighten(skin, 0.10);\n const skinLo = darken(skin, 0.22);\n const skinMid = darken(skin, 0.05);\n\n // Cheek: warm blush relative to skin\n const [sr, sg, sb] = hexToRgb(skin);\n let cheekColor: string;\n if (sL > 120) {\n const rB = sL > 180 ? 0.03 : 0.06;\n const gD = sL > 180 ? 0.30 : 0.28;\n const bD = sL > 180 ? 0.25 : 0.22;\n cheekColor = rgbToHex(\n Math.min(255, sr + sr * rB),\n Math.max(0, sg - sg * gD),\n Math.max(0, sb - sb * bD)\n );\n } else {\n cheekColor = rgbToHex(\n Math.min(255, sr + 50),\n Math.max(0, sg - 10),\n Math.max(0, sb - 5)\n );\n }\n const cheekOpacity = 0.15 + 0.18 * (1 - Math.min(1, sL / 240));\n\n // Lips: smooth skin-relative gradient\n const lipT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const lipBase = blend(\"#D89090\", \"#A83848\", lipT);\n const midBoost = 1 - Math.abs(sL - 140) / 80;\n const lipBlend = (isDark ? 0.70 : 0.62) + Math.max(0, midBoost) * 0.12;\n const lipRaw = blend(skin, lipBase, Math.min(0.82, lipBlend));\n const [lr, lg, lb] = hexToRgb(lipRaw);\n const lipD = Math.abs(sr - lr) + Math.abs(sg - lg) + Math.abs(sb - lb);\n const lipColor = lipD < 60 ? blend(skin, lipBase, 0.78) : lipRaw;\n\n // Features\n const browColor = isDark ? lighten(skin, sL < 80 ? 0.35 : 0.25) : darken(skin, 0.55);\n const noseFill = isDark ? lighten(skin, 0.20) : darken(skin, 0.20);\n const earT = Math.max(0, Math.min(1, (sL - 100) / 60));\n const earFill = blend(lighten(skin, 0.08), skinMid, earT);\n const earShadow = darken(skin, 0.10 + 0.06 * (1 - Math.min(1, sL / 160)));\n const lidColor = isDark ? lighten(skin, 0.18) : darken(skin, 0.15);\n\n // Eye white: adapted to skin luminance\n const ewT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const eyeWhiteAdapted = blend(\"#EDE8E0\", \"#FBF8F2\", ewT);\n\n // Accessory color: skin-warm neutral\n const warmth = sL > 140 ? 0.3 : sL > 100 ? 0.5 : 0.7;\n const accessoryColor = blend(\"#808890\", blend(skin, \"#B0A898\", 0.3), warmth);\n\n return {\n skinHi, skinLo, skinMid, isDark,\n cheekColor, cheekOpacity,\n lipColor, noseFill, browColor,\n earFill, earShadow,\n eyeWhiteAdapted, lidColor,\n accessoryColor,\n };\n}\n\n/** Compute buzz cut opacity — higher when hair/skin contrast is low */\nexport function buzzOpacity(hairCol: string, skin: string): number {\n const [hr, hg, hb] = hexToRgb(hairCol);\n const [sr, sg, sb] = hexToRgb(skin);\n return Math.abs(hr - sr) + Math.abs(hg - sg) + Math.abs(hb - sb) < 80\n ? 0.70\n : 0.50;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — SVG String Renderer\n// Gradient-rich, skin-luminance-driven avatar rendering.\n// Generates SVG markup as strings for server-side and non-React use.\n// ═══════════════════════════════════════════════════════════════\n\nimport {\n generateTraits,\n effectiveAccessory,\n SKIN_COLORS,\n EYE_COLORS,\n HAIR_COLORS,\n BG_COLORS,\n type RenderOptions,\n} from \"./traits\";\nimport { deriveSkinColors, darken, lighten, blend, buzzOpacity } from \"./colors\";\n\nexport type { RenderOptions } from \"./traits\";\n\n// ─── Helpers ────────────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── Gradient Defs ──────────────────────────────\n\nfunction buildDefs(\n id: string,\n skin: string,\n skinHi: string,\n skinLo: string,\n hairCol: string,\n bgCol: string,\n cheekColor: string,\n cheekOpacity: number,\n flat: boolean,\n full: boolean,\n glowIntensity: number,\n): string {\n if (flat) return \"\";\n\n let d = \"<defs>\";\n\n // Skin gradient (top → bottom)\n d += `<linearGradient id=\"${id}sg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinHi}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\"/>`;\n d += `</linearGradient>`;\n\n // Hair gradient\n d += `<linearGradient id=\"${id}hg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${lighten(hairCol, 0.15)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${darken(hairCol, 0.15)}\"/>`;\n d += `</linearGradient>`;\n\n // BG gradient\n d += `<linearGradient id=\"${id}bg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${lighten(bgCol, 0.12)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${darken(bgCol, 0.12)}\"/>`;\n d += `</linearGradient>`;\n\n if (full) {\n // Glow (radial, top center)\n d += `<radialGradient id=\"${id}glow\" cx=\"0.5\" cy=\"0.28\" r=\"0.45\">`;\n d += `<stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"${glowIntensity}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Chin shadow\n d += `<radialGradient id=\"${id}chin\" cx=\"0.5\" cy=\"0.85\" r=\"0.35\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinLo}\" stop-opacity=\"0.30\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek L\n d += `<radialGradient id=\"${id}cL\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek R\n d += `<radialGradient id=\"${id}cR\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n }\n\n d += \"</defs>\";\n return d;\n}\n\n// ─── Hair Back (behind face) ────────────────────\n\nfunction renderHairBack(hi: number, id: string, flat: boolean): string {\n const fill = flat ? \"currentColor\" : `url(#${id}hg)`;\n switch (hi) {\n case 5: // Long\n return `<g fill=\"${fill}\"><rect x=\"10\" y=\"14\" width=\"44\" height=\"42\" rx=\"6\"/></g>`;\n case 6: // Bob\n return `<g fill=\"${fill}\"><rect x=\"12\" y=\"14\" width=\"40\" height=\"32\" rx=\"8\"/></g>`;\n case 8: // Wavy\n return `<g fill=\"${fill}\"><rect x=\"11\" y=\"14\" width=\"42\" height=\"38\" rx=\"8\"/></g>`;\n default:\n return \"\";\n }\n}\n\n// ─── Ears ───────────────────────────────────────\n\nfunction renderEars(earFill: string, earShadow: string): string {\n return (\n `<ellipse cx=\"11\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"11\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>`\n );\n}\n\n// ─── Face ───────────────────────────────────────\n\nfunction renderFace(id: string, skin: string, flat: boolean, opacity: number = 1): string {\n const fill = flat ? skin : `url(#${id}sg)`;\n const opAttr = opacity < 1 ? ` opacity=\"${opacity}\"` : \"\";\n return `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"${fill}\"${opAttr}/>`;\n}\n\n// ─── Face Overlays (full detail) ────────────────\n\nfunction renderFaceOverlays(id: string, flat: boolean): string {\n if (flat) return \"\";\n return (\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}glow)\"/>` +\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}chin)\"/>` +\n `<ellipse cx=\"22\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cL)\"/>` +\n `<ellipse cx=\"42\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cR)\"/>` +\n `<line x1=\"20\" y1=\"50\" x2=\"44\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"0.3\" opacity=\"0.08\" stroke-linecap=\"round\"/>`\n );\n}\n\n// ─── Hair Front ─────────────────────────────────\n\nfunction renderHairFront(hi: number, id: string, hairCol: string, skin: string, flat: boolean): string {\n const fill = flat ? hairCol : `url(#${id}hg)`;\n switch (hi) {\n case 0: return \"\"; // Bald\n case 1: // Short\n return `<path d=\"M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z\" fill=\"${fill}\"/>`;\n case 2: // Curly\n return (\n `<g fill=\"${fill}\">` +\n `<circle cx=\"20\" cy=\"14\" r=\"5\"/>` +\n `<circle cx=\"28\" cy=\"11\" r=\"5.5\"/>` +\n `<circle cx=\"36\" cy=\"11\" r=\"5.5\"/>` +\n `<circle cx=\"44\" cy=\"14\" r=\"5\"/>` +\n `<circle cx=\"16\" cy=\"20\" r=\"4\"/>` +\n `<circle cx=\"48\" cy=\"20\" r=\"4\"/>` +\n `</g>`\n );\n case 3: // Side sweep\n return (\n `<path d=\"M14 26 Q14 12 32 10 Q50 12 50 26 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<path d=\"M14 20 Q8 16 10 8 Q14 10 20 16 Z\" fill=\"${fill}\"/>`\n );\n case 4: // Puff\n return `<ellipse cx=\"32\" cy=\"10\" rx=\"14\" ry=\"8\" fill=\"${fill}\"/>`;\n case 5: // Long\n return `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>`;\n case 6: // Bob\n return (\n `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<rect x=\"10\" y=\"28\" width=\"8\" height=\"14\" rx=\"4\" fill=\"${fill}\"/>` +\n `<rect x=\"46\" y=\"28\" width=\"8\" height=\"14\" rx=\"4\" fill=\"${fill}\"/>`\n );\n case 7: { // Buzz\n const bOp = buzzOpacity(hairCol, skin);\n return `<rect x=\"15\" y=\"13\" width=\"34\" height=\"16\" rx=\"10\" ry=\"8\" fill=\"${hairCol}\" opacity=\"${bOp.toFixed(2)}\"/>`;\n }\n case 8: // Wavy\n return (\n `<path d=\"M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z\" fill=\"${fill}\"/>` +\n `<path d=\"M12 30 Q10 20 14 16\" fill=\"none\" stroke=\"${fill}\" stroke-width=\"4\" stroke-linecap=\"round\"/>` +\n `<path d=\"M52 30 Q54 20 50 16\" fill=\"none\" stroke=\"${fill}\" stroke-width=\"4\" stroke-linecap=\"round\"/>`\n );\n case 9: // Topknot\n return (\n `<path d=\"M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z\" fill=\"${fill}\"/>` +\n `<ellipse cx=\"32\" cy=\"6\" rx=\"6\" ry=\"5\" fill=\"${fill}\"/>`\n );\n default: return \"\";\n }\n}\n\n// ─── Eyes ───────────────────────────────────────\n\nfunction renderEyes(\n ei: number,\n eyeCol: string,\n eyeWhite: string,\n lidColor: string,\n full: boolean,\n): string {\n const lx = 25, rx = 39, y = 33;\n let s = \"\";\n\n switch (ei) {\n case 0: // Round\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 1: // Minimal\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n break;\n case 2: // Almond\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n break;\n case 3: // Wide\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 4: // Relaxed\n s += `<ellipse cx=\"${lx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${lx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${lx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${rx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${rx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n break;\n case 5: // Joyful\n s += `<path d=\"M${lx - 4} ${y} Q${lx} ${y + 4} ${lx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>`;\n s += `<path d=\"M${rx - 4} ${y} Q${rx} ${y + 4} ${rx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>`;\n break;\n case 6: // Bright\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n if (full) {\n s += `<line x1=\"${lx + 2.5}\" y1=\"${y - 3.5}\" x2=\"${lx + 4}\" y2=\"${y - 5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<line x1=\"${lx + 3.5}\" y1=\"${y - 2.5}\" x2=\"${lx + 5}\" y2=\"${y - 3.5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n }\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n if (full) {\n s += `<line x1=\"${rx + 2.5}\" y1=\"${y - 3.5}\" x2=\"${rx + 4}\" y2=\"${y - 5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<line x1=\"${rx + 3.5}\" y1=\"${y - 2.5}\" x2=\"${rx + 5}\" y2=\"${y - 3.5}\" stroke=\"${eyeCol}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n }\n break;\n case 7: // Gentle\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${lx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${rx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n break;\n default:\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n }\n\n // Eyelid strokes in full detail (except joyful/minimal)\n if (full && ei !== 1 && ei !== 5) {\n s += `<path d=\"M${lx - 4} ${y - 1.5} Q${lx} ${y - 4} ${lx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n s += `<path d=\"M${rx - 4} ${y - 1.5} Q${rx} ${y - 4} ${rx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n }\n\n return s;\n}\n\n// ─── Eyebrows ───────────────────────────────────\n\nfunction renderEyebrows(bi: number, browColor: string): string {\n const lx = 25, rx = 39, y = 27;\n switch (bi) {\n case 0: // Wispy\n return (\n `<line x1=\"${lx - 3}\" y1=\"${y}\" x2=\"${lx + 3}\" y2=\"${y - 0.5}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3}\" y1=\"${y - 0.5}\" x2=\"${rx + 3}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>`\n );\n case 1: // Straight\n return (\n `<line x1=\"${lx - 3.5}\" y1=\"${y}\" x2=\"${lx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3.5}\" y1=\"${y}\" x2=\"${rx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 2: // Natural\n return (\n `<path d=\"M${lx - 3.5} ${y + 0.5} Q${lx} ${y - 1.5} ${lx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 3.5} ${y + 0.5} Q${rx} ${y - 1.5} ${rx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 3: // Arched\n return (\n `<path d=\"M${lx - 4} ${y + 1} Q${lx} ${y - 3} ${lx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 4} ${y + 1} Q${rx} ${y - 3} ${rx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>`\n );\n case 4: // Angled\n return (\n `<polyline points=\"${lx - 3},${y + 1} ${lx},${y - 2} ${lx + 3},${y}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<polyline points=\"${rx - 3},${y} ${rx},${y - 2} ${rx + 3},${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`\n );\n default:\n return \"\";\n }\n}\n\n// ─── Nose ───────────────────────────────────────\n\nfunction renderNose(ni: number, noseFill: string): string {\n const cx = 32, y = 39;\n switch (ni) {\n case 0: // Shadow\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n case 1: // Button\n return `<circle cx=\"${cx}\" cy=\"${y}\" r=\"1.8\" fill=\"${noseFill}\" opacity=\"0.5\"/>`;\n case 2: // Soft\n return `<path d=\"M${cx - 2} ${y + 1} Q${cx} ${y - 2} ${cx + 2} ${y + 1}\" fill=\"none\" stroke=\"${noseFill}\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`;\n case 3: // Nostrils\n return (\n `<circle cx=\"${cx - 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>` +\n `<circle cx=\"${cx + 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>`\n );\n default:\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n }\n}\n\n// ─── Mouth ──────────────────────────────────────\n\nfunction renderMouth(mi: number, lipColor: string, isDark: boolean): string {\n const cx = 32, y = 45;\n const teethCol = isDark ? \"#e8e0d8\" : \"#ffffff\";\n switch (mi) {\n case 0: // Smile\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n case 1: // Calm\n return `<line x1=\"${cx - 3}\" y1=\"${y + 1}\" x2=\"${cx + 3}\" y2=\"${y + 1}\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`;\n case 2: // Happy\n return `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 5} ${cx + 5} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`;\n case 3: // Oh\n return `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"2.5\" ry=\"3\" fill=\"${lipColor}\" opacity=\"0.7\"/>`;\n case 4: // Smirk\n return `<path d=\"M${cx - 4} ${y + 1} Q${cx + 1} ${y + 1} ${cx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>`;\n case 5: // Grin\n return (\n `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 6} ${cx + 5} ${y}\" fill=\"${teethCol}\" stroke=\"${lipColor}\" stroke-width=\"1\"/>` +\n `<line x1=\"${cx - 4}\" y1=\"${y + 1.5}\" x2=\"${cx + 4}\" y2=\"${y + 1.5}\" stroke=\"${lipColor}\" stroke-width=\"0.3\" opacity=\"0.3\"/>`\n );\n case 6: // Flat\n return `<line x1=\"${cx - 4}\" y1=\"${y + 1}\" x2=\"${cx + 4}\" y2=\"${y + 1}\" stroke=\"${lipColor}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`;\n case 7: // Pout\n return (\n `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"3.5\" ry=\"2\" fill=\"${lipColor}\" opacity=\"0.25\"/>` +\n `<path d=\"M${cx - 3} ${y} Q${cx} ${y + 2.5} ${cx + 3} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n default:\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n }\n}\n\n// ─── Accessories ────────────────────────────────\n\nfunction renderAccessory(\n ai: number,\n accessoryColor: string,\n glassesColor: string,\n earringColor: string,\n headbandColor: string,\n): string {\n switch (ai) {\n case 0: return \"\"; // None\n case 1: // Beauty mark\n return `<circle cx=\"40\" cy=\"44\" r=\"0.8\" fill=\"#3a2a2a\"/>`;\n case 2: // Round glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<circle cx=\"25\" cy=\"33\" r=\"5.5\"/>` +\n `<circle cx=\"39\" cy=\"33\" r=\"5.5\"/>` +\n `<line x1=\"30.5\" y1=\"33\" x2=\"33.5\" y2=\"33\"/>` +\n `<line x1=\"19.5\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"44.5\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 3: // Rect glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<rect x=\"19\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<rect x=\"33\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<line x1=\"31\" y1=\"33\" x2=\"33\" y2=\"33\"/>` +\n `<line x1=\"19\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"45\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 4: // Earring\n return (\n `<circle cx=\"10\" cy=\"38\" r=\"1.5\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"10\" cy=\"41\" r=\"2\" fill=\"${earringColor}\" opacity=\"0.8\"/>`\n );\n case 5: // Headband\n return `<rect x=\"13\" y=\"20\" width=\"38\" height=\"3.5\" rx=\"1.5\" fill=\"${headbandColor}\" opacity=\"0.85\"/>`;\n case 6: // Freckles\n return (\n `<g fill=\"#a0785a\" opacity=\"0.35\">` +\n `<circle cx=\"21\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"23\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"19\" cy=\"41.5\" r=\"0.5\"/>` +\n `<circle cx=\"43\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"41\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"45\" cy=\"41.5\" r=\"0.5\"/>` +\n `</g>`\n );\n case 7: // Stud earrings\n return (\n `<circle cx=\"10\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"54\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>`\n );\n case 8: // Aviators\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1.2\">` +\n `<path d=\"M19 30 Q19 28 25 28 Q31 28 31 33 Q31 38 25 38 Q19 38 19 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<path d=\"M33 30 Q33 28 39 28 Q45 28 45 33 Q45 38 39 38 Q33 38 33 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<line x1=\"31\" y1=\"32\" x2=\"33\" y2=\"32\"/>` +\n `<line x1=\"19\" y1=\"31\" x2=\"14\" y2=\"29\"/>` +\n `<line x1=\"45\" y1=\"31\" x2=\"50\" y2=\"29\"/>` +\n `</g>`\n );\n case 9: // Band-Aid\n return (\n `<g>` +\n `<rect x=\"38\" y=\"38\" width=\"8\" height=\"4\" rx=\"1\" fill=\"#f0d0a0\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"40\" y1=\"39\" x2=\"40\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"42\" y1=\"39\" x2=\"42\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `<line x1=\"44\" y1=\"39\" x2=\"44\" y2=\"41\" stroke=\"#c0a080\" stroke-width=\"0.4\" transform=\"rotate(-15 42 40)\"/>` +\n `</g>`\n );\n default:\n return \"\";\n }\n}\n\n// ─── Main Render Functions ──────────────────────\n\nexport function renderSolFaceSVG(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const { size = 64, theme, traitOverrides, enableBlink, className, colorOverrides } = options ?? {};\n const traits = generateTraits(walletAddress, traitOverrides);\n\n // Resolve detail level\n const detailOpt = options?.detail ?? \"auto\";\n const full = detailOpt === \"full\" || (detailOpt === \"auto\" && size >= 48);\n const flat = theme?.flat ?? false;\n\n // Color palettes\n const skinColors = theme?.skinColors ?? SKIN_COLORS;\n const eyeColors = theme?.eyeColors ?? EYE_COLORS;\n const hairColors = theme?.hairColors ?? HAIR_COLORS;\n const bgColors = theme?.bgColors ?? BG_COLORS;\n\n const skin = colorOverrides?.skin ?? skinColors[traits.skinColor % skinColors.length];\n const eyeCol = colorOverrides?.eyes ?? eyeColors[traits.eyeColor % eyeColors.length];\n const hairCol = colorOverrides?.hair ?? hairColors[traits.hairColor % hairColors.length];\n const bgCol = colorOverrides?.bg ?? bgColors[traits.bgColor % bgColors.length];\n\n // Derived skin colors\n const derived = deriveSkinColors(skin);\n\n const bgOpacity = theme?.bgOpacity ?? 1;\n const bgRadius = theme?.bgRadius ?? 4;\n const browColor = colorOverrides?.eyebrow ?? theme?.eyebrowColor ?? derived.browColor;\n const noseFill = colorOverrides?.nose ?? theme?.noseColor ?? derived.noseFill;\n const lipColor = colorOverrides?.mouth ?? theme?.mouthColor ?? derived.lipColor;\n const accColor = colorOverrides?.accessory ?? theme?.accessoryColor ?? derived.accessoryColor;\n const eyeWhite = colorOverrides?.eyeWhite ?? theme?.eyeWhiteColor ?? derived.eyeWhiteAdapted;\n const glassesColor = theme?.glassesColor ?? \"#4a4a5a\";\n const earringColor = theme?.earringColor ?? blend(skin, \"#d4a840\", 0.4);\n const headbandColor = theme?.headbandColor ?? blend(hairCol, \"#c04040\", 0.5);\n\n // Unique gradient ID prefix (collision-resistant)\n const id = \"sf\" + djb2(walletAddress).toString(36);\n\n // Cheek\n const cheekEnabled = theme?.cheekEnabled ?? true;\n const cheekColor = theme?.cheekColor ?? derived.cheekColor;\n const cheekOpacity = theme?.cheekOpacity ?? derived.cheekOpacity;\n\n const hi = traits.hairStyle % 10;\n const ai = effectiveAccessory(traits);\n\n const classAttr = className ? ` class=\"${className}\"` : \"\";\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" width=\"${size}\" height=\"${size}\"${classAttr}>`;\n\n // Defs\n const glowIntensity = theme?.glowIntensity ?? 0.10;\n svg += buildDefs(id, skin, derived.skinHi, derived.skinLo, hairCol, bgCol, cheekColor, cheekOpacity, flat, full && cheekEnabled, glowIntensity);\n\n // Blink animation\n const blinkEnabled = !!enableBlink;\n const blinkDuration = typeof enableBlink === \"object\" ? (enableBlink.duration ?? 4) : 4;\n const blinkDelay = typeof enableBlink === \"object\" ? (enableBlink.delay ?? 0) : 0;\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n const delayStr = blinkDelay ? ` ${blinkDelay}s` : \"\";\n svg += `<style>@keyframes ${uid}-blink{0%,90%,100%{transform:scaleY(1)}95%{transform:scaleY(0.1)}}.${uid}-eyes{animation:${uid}-blink ${blinkDuration}s ease-in-out${delayStr} infinite;transform-origin:32px 33px}</style>`;\n }\n\n // Background\n const bgFill = flat ? bgCol : `url(#${id}bg)`;\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"${bgFill}\" opacity=\"${bgOpacity}\" rx=\"${bgRadius}\"/>`;\n\n // Hair back (Long, Bob, Wavy — behind face)\n svg += renderHairBack(hi, id, flat);\n\n // Ears\n svg += renderEars(derived.earFill, derived.earShadow);\n\n // Face\n const skinOpacity = theme?.skinOpacity ?? 1;\n svg += renderFace(id, skin, flat, skinOpacity);\n\n // Face overlays (glow, chin shadow, cheeks, jawline) — full detail only\n const shadowEnabled = theme?.shadowEnabled ?? true;\n if (full && cheekEnabled && shadowEnabled) {\n svg += renderFaceOverlays(id, flat);\n }\n\n // Headband (renders before eyes, after face)\n if (ai === 5) {\n svg += renderAccessory(5, accColor, glassesColor, earringColor, headbandColor);\n }\n\n // Hair front\n svg += renderHairFront(hi, id, hairCol, skin, flat);\n\n // Eyes\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n svg += `<g class=\"${uid}-eyes\">`;\n }\n svg += renderEyes(traits.eyeStyle % 8, eyeCol, eyeWhite, derived.lidColor, full);\n if (blinkEnabled) svg += `</g>`;\n\n // Eyebrows\n svg += renderEyebrows(traits.eyebrows % 5, browColor);\n\n // Nose\n svg += renderNose(traits.nose % 4, noseFill);\n\n // Mouth\n svg += renderMouth(traits.mouth % 8, lipColor, derived.isDark);\n\n // Accessories (except headband, already rendered)\n if (ai !== 0 && ai !== 5) {\n svg += renderAccessory(ai, accColor, glassesColor, earringColor, headbandColor);\n }\n\n // Border\n if (theme?.border) {\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"none\" stroke=\"${theme.border.color}\" stroke-width=\"${theme.border.width}\" rx=\"${bgRadius}\"/>`;\n }\n\n svg += `</svg>`;\n return svg;\n}\n\nexport function renderSolFaceDataURI(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function renderSolFaceBase64(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — AI Agent Description Generator\n// Produces natural language descriptions of a wallet's SolFace\n// for use in system prompts, bios, and self-reference.\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, effectiveAccessory, type SolFaceTraits } from \"./traits\";\n\n// ─── Vocabulary Maps ─────────────────────────────────────────\n\nconst SKIN_TONES: Record<number, string> = {\n 0: \"porcelain\",\n 1: \"ivory\",\n 2: \"fair\",\n 3: \"light\",\n 4: \"sand\",\n 5: \"golden\",\n 6: \"warm\",\n 7: \"caramel\",\n 8: \"brown\",\n 9: \"deep\",\n};\n\nconst EYE_STYLES: Record<number, string> = {\n 0: \"round, wide-open\",\n 1: \"small and minimal\",\n 2: \"almond-shaped\",\n 3: \"wide and expressive\",\n 4: \"relaxed, half-lidded\",\n 5: \"joyful, crescent-shaped\",\n 6: \"bright and sparkling\",\n 7: \"gentle and narrow\",\n};\n\nconst EYE_COLORS_DESC: Record<number, string> = {\n 0: \"dark brown\",\n 1: \"blue\",\n 2: \"green\",\n 3: \"hazel\",\n 4: \"gray\",\n};\n\nconst EYEBROW_STYLES: Record<number, string> = {\n 0: \"wispy\",\n 1: \"straight\",\n 2: \"natural\",\n 3: \"elegantly arched\",\n 4: \"sharply angled\",\n};\n\nconst NOSE_STYLES: Record<number, string> = {\n 0: \"a subtle shadow nose\",\n 1: \"a small button nose\",\n 2: \"a soft curved nose\",\n 3: \"a button nose with visible nostrils\",\n};\n\nconst MOUTH_STYLES: Record<number, string> = {\n 0: \"a gentle smile\",\n 1: \"a calm, neutral expression\",\n 2: \"a happy grin\",\n 3: \"a surprised O-shaped mouth\",\n 4: \"a confident smirk\",\n 5: \"a wide, toothy grin\",\n 6: \"a flat, straight expression\",\n 7: \"a soft pout\",\n};\n\nconst HAIR_STYLES: Record<number, string> = {\n 0: \"bald, with no hair\",\n 1: \"short, neatly cropped hair\",\n 2: \"bouncy, curly hair\",\n 3: \"side-swept hair\",\n 4: \"a voluminous puff\",\n 5: \"long hair that falls past the shoulders\",\n 6: \"a clean bob cut\",\n 7: \"a close buzz cut\",\n 8: \"flowing, wavy hair\",\n 9: \"a neat topknot\",\n};\n\nconst HAIR_COLORS_DESC: Record<number, string> = {\n 0: \"jet black\",\n 1: \"espresso brown\",\n 2: \"walnut\",\n 3: \"honey blonde\",\n 4: \"copper red\",\n 5: \"silver\",\n 6: \"charcoal\",\n 7: \"burgundy\",\n 8: \"strawberry\",\n 9: \"ginger\",\n};\n\nconst ACCESSORY_DESC: Record<number, string> = {\n 0: \"\",\n 1: \"a beauty mark\",\n 2: \"round glasses\",\n 3: \"rectangular glasses\",\n 4: \"a dangling earring\",\n 5: \"a headband\",\n 6: \"freckles\",\n 7: \"stud earrings\",\n 8: \"aviator sunglasses\",\n 9: \"a band-aid\",\n};\n\nconst BG_COLORS_DESC: Record<number, string> = {\n 0: \"rose\",\n 1: \"olive\",\n 2: \"sage\",\n 3: \"fern\",\n 4: \"mint\",\n 5: \"ocean\",\n 6: \"sky\",\n 7: \"lavender\",\n 8: \"orchid\",\n 9: \"blush\",\n};\n\n// ─── Description Builder ─────────────────────────────────────\n\nexport interface DescribeOptions {\n includeBackground?: boolean;\n format?: \"paragraph\" | \"structured\" | \"compact\";\n perspective?: \"first\" | \"third\";\n name?: string;\n}\n\nexport function describeAppearance(\n walletAddress: string,\n options?: DescribeOptions,\n): string {\n const traits = generateTraits(walletAddress);\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\nexport function describeTraits(\n traits: SolFaceTraits,\n options?: DescribeOptions,\n): string {\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\n// ─── Builders ────────────────────────────────────────────────\n\nfunction buildParagraph(\n t: SolFaceTraits,\n perspective: \"first\" | \"third\",\n name?: string,\n includeBg?: boolean,\n): string {\n const parts: string[] = [];\n const ai = effectiveAccessory(t);\n\n const subject = perspective === \"first\"\n ? (name ? `I'm ${name}. I have` : \"I have\")\n : (name ? `${name} has` : \"This SolFace has\");\n\n const im = perspective === \"first\" ? \"I'm\" : \"They're\";\n\n // Face + skin (all squircle now)\n parts.push(`${subject} a squircle face with ${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n\n // Eyes\n const eyeStyle = EYE_STYLES[t.eyeStyle] ?? \"round\";\n const eyeColor = EYE_COLORS_DESC[t.eyeColor] ?? \"dark\";\n parts.push(`${eyeStyle} ${eyeColor} eyes`);\n\n // Eyebrows\n const brows = EYEBROW_STYLES[t.eyebrows];\n if (brows) parts.push(`${brows} eyebrows`);\n\n // Hair\n const hairStyle = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hairColor = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n if (t.hairStyle === 0) {\n parts.push(perspective === \"first\" ? \"and am bald\" : \"and is bald\");\n } else if (hairStyle.startsWith(\"a \")) {\n parts.push(`and a ${hairColor} ${hairStyle.slice(2)}`);\n } else {\n parts.push(`and ${hairColor} ${hairStyle}`);\n }\n\n // Build main sentence\n let desc = parts[0];\n if (parts.length > 2) {\n desc += \", \" + parts.slice(1, -1).join(\", \") + \", \" + parts[parts.length - 1];\n } else if (parts.length === 2) {\n desc += \" and \" + parts[1];\n }\n desc += \".\";\n\n // Nose\n const nose = NOSE_STYLES[t.nose];\n if (nose) {\n const noseSubject = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${noseSubject} ${nose}.`;\n }\n\n // Accessory\n const acc = ACCESSORY_DESC[ai];\n if (acc) {\n desc += ` ${im} wearing ${acc}.`;\n }\n\n // Mouth\n const mouth = MOUTH_STYLES[t.mouth] ?? \"a smile\";\n const mouthVerb = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${mouthVerb} ${mouth}.`;\n\n // Background\n if (includeBg) {\n const bg = BG_COLORS_DESC[t.bgColor] ?? \"colorful\";\n desc += ` The background is ${bg}.`;\n }\n\n return desc;\n}\n\nfunction buildStructured(t: SolFaceTraits, includeBg: boolean): string {\n const ai = effectiveAccessory(t);\n const lines: string[] = [\n `Face: squircle`,\n `Skin: ${SKIN_TONES[t.skinColor] ?? \"warm\"}`,\n `Eyes: ${EYE_STYLES[t.eyeStyle] ?? \"round\"}, ${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"}`,\n `Eyebrows: ${EYEBROW_STYLES[t.eyebrows] ?? \"wispy\"}`,\n ];\n\n const nose = NOSE_STYLES[t.nose];\n if (nose) lines.push(`Nose: ${nose.replace(/^a /, \"\")}`);\n\n lines.push(`Mouth: ${MOUTH_STYLES[t.mouth] ?? \"smile\"}`);\n\n if (t.hairStyle === 0) {\n lines.push(\"Hair: bald\");\n } else {\n const hs = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n lines.push(`Hair: ${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) lines.push(`Accessory: ${acc}`);\n\n if (includeBg) {\n lines.push(`Background: ${BG_COLORS_DESC[t.bgColor] ?? \"colorful\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildCompact(t: SolFaceTraits): string {\n const ai = effectiveAccessory(t);\n const parts: string[] = [];\n\n parts.push(`squircle face`);\n parts.push(`${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n parts.push(`${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"} ${EYE_STYLES[t.eyeStyle] ?? \"round\"} eyes`);\n\n if (t.hairStyle === 0) {\n parts.push(\"bald\");\n } else {\n const raw = HAIR_STYLES[t.hairStyle] ?? \"hair\";\n const hs = raw.includes(\",\") ? raw.replace(/.*,\\s*/, \"\") : raw;\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n parts.push(`${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) parts.push(acc);\n\n parts.push((MOUTH_STYLES[t.mouth] ?? \"smiling\").replace(/^a /, \"\"));\n\n return parts.join(\", \");\n}\n\n// ─── Alt Text Helper ─────────────────────────────────────────\n\nexport function solFaceAltText(walletAddress: string): string {\n return `SolFace avatar: ${describeAppearance(walletAddress, { format: \"compact\", includeBackground: false })}`;\n}\n\n// ─── System Prompt Helper ────────────────────────────────────\n\nexport function agentAppearancePrompt(\n walletAddress: string,\n agentName?: string,\n): string {\n const desc = describeAppearance(walletAddress, {\n perspective: \"first\",\n name: agentName,\n includeBackground: false,\n format: \"paragraph\",\n });\n\n const hash = (djb2Simple(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n\n return `My visual identity is a SolFace avatar (ID: ${hash}) derived from my wallet address. ${desc} This appearance is deterministic — anyone who looks up my wallet will see the same face.`;\n}\n\n// Inline djb2 to avoid circular dependency\nfunction djb2Simple(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — Preset Themes\n// ═══════════════════════════════════════════════════════════════\n\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Default (base look — gradients, no overrides) ─\n\nexport const defaultTheme: SolFaceTheme = {};\n\n// ─── Base Themes ────────────────────────────────\n\nexport const darkTheme: SolFaceTheme = {\n bgColors: [\"#1a1b23\", \"#1e1428\", \"#0a1e38\", \"#1b2838\", \"#201028\",\n \"#141a28\", \"#18122a\", \"#1a2020\", \"#221822\", \"#1e1020\"],\n eyeWhiteColor: \"#d8d0c8\",\n bgOpacity: 1,\n bgRadius: 4,\n border: { color: \"#333340\", width: 0.5 },\n};\n\nexport const lightTheme: SolFaceTheme = {\n bgColors: [\"#f5e8ea\", \"#f0f0d8\", \"#e4f0e6\", \"#d8f0e8\", \"#e0ece8\",\n \"#dce8f0\", \"#e0e4f0\", \"#e0d8f0\", \"#f0e0ee\", \"#f0d8e4\"],\n bgOpacity: 1,\n bgRadius: 8,\n};\n\nexport const monoTheme: SolFaceTheme = {\n skinColors: [\"#e8e8e8\", \"#d4d4d4\", \"#c0c0c0\", \"#a8a8a8\", \"#909090\",\n \"#787878\", \"#606060\", \"#505050\", \"#404040\", \"#303030\"],\n eyeColors: [\"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\"],\n hairColors: [\"#1a1a1a\", \"#2a2a2a\", \"#404040\", \"#555\", \"#707070\",\n \"#888\", \"#a0a0a0\", \"#b8b8b8\", \"#d0d0d0\", \"#e0e0e0\"],\n bgColors: [\"#e8e0e0\", \"#e0e0d0\", \"#d8e0d8\", \"#d0e0d8\", \"#d8e0e0\",\n \"#d0d8e0\", \"#d4d4e0\", \"#d4d0e0\", \"#e0d8e0\", \"#e0d0d8\"],\n mouthColor: \"#666\",\n eyebrowColor: \"#555\",\n accessoryColor: \"#777\",\n eyeWhiteColor: \"#f0f0f0\",\n bgOpacity: 0.5,\n bgRadius: 4,\n};\n\nexport const flatTheme: SolFaceTheme = {\n flat: true,\n};\n\nexport const transparentTheme: SolFaceTheme = {\n flat: true,\n bgOpacity: 0,\n};\n\n// ─── React-Only: Liquid Glass ───────────────────\n\nexport const glassTheme: SolFaceTheme = {\n bgOpacity: 0.15,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 12,\n _saturate: 1.8,\n _tintOpacity: 0.12,\n _tintColor: \"rgba(255,255,255,1)\",\n _borderOpacity: 0.25,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.25)\",\n _specularOpacity: 0.25,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 50,\n _lightAngle: 135,\n _rimIntensity: 0.08,\n _shadow: \"0 8px 32px rgba(0,0,0,0.12)\",\n};\n\nexport const glassDarkTheme: SolFaceTheme = {\n bgOpacity: 0.2,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 16,\n _saturate: 2.0,\n _tintOpacity: 0.08,\n _tintColor: \"rgba(0,0,0,1)\",\n _borderOpacity: 0.15,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.15)\",\n _specularOpacity: 0.15,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 40,\n _lightAngle: 135,\n _rimIntensity: 0.05,\n _shadow: \"0 8px 32px rgba(0,0,0,0.25)\",\n};\n\n// ─── React-Only: Pixel Art ──────────────────────\n\nexport const pixelTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 16,\n _pixelRounded: true,\n _pixelOutline: true,\n _pixelOutlineColor: \"#222\",\n _pixelOutlineWidth: 2,\n};\n\nexport const pixelRetroTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 12,\n _pixelRounded: false,\n _pixelOutline: true,\n _pixelOutlineColor: \"#000\",\n _pixelOutlineWidth: 2,\n _pixelScanlines: true,\n _pixelScanlineOpacity: 0.1,\n _pixelScanlineSpacing: 2,\n _pixelShadow: true,\n _pixelShadowColor: \"rgba(0,0,0,0.4)\",\n _pixelShadowOffset: 3,\n};\n\nexport const pixelCleanTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 24,\n _pixelRounded: true,\n _pixelOutline: false,\n};\n\n// ─── Theme Map ──────────────────────────────────\n\nexport const PRESET_THEMES: Record<string, SolFaceTheme> = {\n default: defaultTheme,\n dark: darkTheme,\n light: lightTheme,\n mono: monoTheme,\n flat: flatTheme,\n transparent: transparentTheme,\n glass: glassTheme,\n glassDark: glassDarkTheme,\n pixel: pixelTheme,\n pixelRetro: pixelRetroTheme,\n pixelClean: pixelCleanTheme,\n};\n\nexport function getPresetTheme(\n name: string,\n overrides?: Partial<SolFaceTheme>,\n): SolFaceTheme {\n const base = PRESET_THEMES[name];\n if (!base) return (overrides as SolFaceTheme) ?? {};\n return overrides ? { ...base, ...overrides } : base;\n}\n"],"mappings":"scAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KCiHO,IAAMC,GAAc,CACzB,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAC9C,EAEaC,GAAa,CACxB,UAAW,UAAW,UAAW,UAAW,SAC9C,EAEaC,GAAc,CACzB,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAC9C,EAEaC,GAAY,CACvB,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAC9C,EAIA,SAASC,GAAKC,EAAqB,CACjC,IAAIC,EAAO,KACX,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BD,GAASA,GAAQ,GAAKA,EAAOD,EAAI,WAAWE,CAAC,EAAK,EAEpD,OAAOD,IAAS,CAClB,CAIA,SAASE,GAAWC,EAA4B,CAC9C,IAAIC,EAAID,EAAO,EACf,MAAO,IAAM,CACXC,EAAKA,EAAI,WAAc,EACvB,IAAI,EAAI,KAAK,KAAKA,EAAKA,IAAM,GAAK,EAAIA,CAAC,EACvC,SAAK,EAAI,KAAK,KAAK,EAAK,IAAM,EAAI,GAAK,CAAC,EAAK,IACpC,EAAK,IAAM,MAAS,GAAK,UACpC,CACF,CAIO,SAASC,EACdC,EACAC,EACe,CACf,IAAMJ,EAAOL,GAAKQ,CAAa,EACzBE,EAAON,GAAWC,CAAI,EAItBM,EAAwB,CAC5B,UAAY,KAAK,MAAMD,EAAK,EAAI,CAAC,EACjC,UAAY,KAAK,MAAMA,EAAK,EAAI,EAAE,EAClC,SAAY,KAAK,MAAMA,EAAK,EAAI,CAAC,EACjC,SAAY,KAAK,MAAMA,EAAK,EAAI,CAAC,EACjC,SAAY,KAAK,MAAMA,EAAK,EAAI,CAAC,EACjC,KAAY,KAAK,MAAMA,EAAK,EAAI,CAAC,EACjC,MAAY,KAAK,MAAMA,EAAK,EAAI,CAAC,EACjC,UAAY,KAAK,MAAMA,EAAK,EAAI,EAAE,EAClC,UAAY,KAAK,MAAMA,EAAK,EAAI,EAAE,EAClC,UAAY,KAAK,MAAMA,EAAK,EAAI,EAAE,EAClC,QAAY,KAAK,MAAMA,EAAK,EAAI,EAAE,CACpC,EAEA,OAAOD,EAAY,CAAE,GAAGE,EAAQ,GAAGF,CAAU,EAAIE,CACnD,CAKO,SAASC,EAAmBD,EAA+B,CAChE,IAAME,EAAKF,EAAO,UAAY,GACxBG,EAAKH,EAAO,UAAY,GAC9B,OAAKE,IAAO,GAAKA,IAAO,KAAOC,IAAO,GAAKA,IAAO,GAAW,EACtDD,CACT,CAIA,IAAME,GAAc,CAAC,UAAU,EACzBC,GAAc,CAClB,YAAa,QAAS,OAAQ,QAAS,OACvC,SAAU,OAAQ,UAAW,QAAS,MACxC,EACMC,GAAmB,CAAC,QAAS,UAAW,SAAU,OAAQ,UAAW,SAAU,SAAU,QAAQ,EACjGC,GAAmB,CAAC,YAAa,MAAO,UAAW,QAAS,OAAO,EACnEC,GAAc,CAAC,QAAS,WAAY,UAAW,SAAU,QAAQ,EACjEC,GAAc,CAAC,SAAU,SAAU,OAAQ,UAAU,EACrDC,GAAe,CAAC,QAAS,OAAQ,QAAS,KAAM,QAAS,OAAQ,OAAQ,MAAM,EAC/EC,GAAoB,CACxB,OAAQ,QAAS,QAAS,aAAc,OACxC,OAAQ,MAAO,OAAQ,OAAQ,SACjC,EACMC,GAAoB,CACxB,QAAS,WAAY,SAAU,QAAS,SACxC,SAAU,WAAY,WAAY,aAAc,QAClD,EACMC,GAAmB,CACvB,OAAQ,cAAe,gBAAiB,eAAgB,UACxD,WAAY,WAAY,gBAAiB,WAAY,UACvD,EACMC,GAAkB,CACtB,OAAQ,QAAS,OAAQ,OAAQ,OACjC,QAAS,MAAO,WAAY,SAAU,OACxC,EAEO,SAASC,GAAef,EAA+C,CAC5E,MAAO,CACL,UAAWI,GAAY,CAAC,EACxB,UAAWC,GAAYL,EAAO,SAAS,GAAK,OAC5C,SAAUM,GAAiBN,EAAO,QAAQ,GAAK,QAC/C,SAAUO,GAAiBP,EAAO,QAAQ,GAAK,YAC/C,SAAUQ,GAAYR,EAAO,QAAQ,GAAK,QAC1C,KAAMS,GAAYT,EAAO,IAAI,GAAK,SAClC,MAAOU,GAAaV,EAAO,KAAK,GAAK,QACrC,UAAWW,GAAkBX,EAAO,SAAS,GAAK,OAClD,UAAWY,GAAkBZ,EAAO,SAAS,GAAK,QAClD,UAAWa,GAAiBZ,EAAmBD,CAAM,CAAC,GAAK,OAC3D,QAASc,GAAgBd,EAAO,OAAO,GAAK,MAC9C,CACF,CAIO,SAASgB,GAAUnB,EAA+B,CACvD,OAAQR,GAAKQ,CAAa,IAAM,GAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CACjE,CAIO,SAASoB,GACdC,EACAC,EAC0B,CAC1B,GAAI,GAACD,GAAa,CAACC,GACnB,OAAOA,EAAOD,CAAS,CACzB,CCtPA,IAAME,GAAuB,CAC3B,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,UAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,UAAY,UAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACtC,EAEA,SAASC,EAAKC,EAAWC,EAAmB,CAC1C,OAAQA,IAAMD,EAAMC,GAAM,GAAKD,CACjC,CAEO,SAASE,EAAOC,EAA2B,CAGhD,IAAMC,EADU,IAAI,YAAY,EACZ,OAAOD,CAAK,EAC1BE,EAASD,EAAI,OAAS,EAGtBE,EAAS,IAAOF,EAAI,OAAS,GAAK,GAClCG,EAAWH,EAAI,OAAS,GAAKE,IAAW,GAAK,EAAIA,GAAU,EAC3DE,EAAM,IAAI,WAAWD,CAAQ,EACnCC,EAAI,IAAIJ,CAAG,EACXI,EAAIJ,EAAI,MAAM,EAAI,IAElB,IAAMK,EAAK,IAAI,SAASD,EAAI,MAAM,EAClCC,EAAG,UAAUF,EAAW,EAAGF,EAAQ,EAAK,EAGxC,IAAIK,EAAK,WAAYC,EAAK,WAAYC,EAAK,WAAYC,EAAK,WACxDC,EAAK,WAAYC,EAAK,WAAYC,EAAK,UAAYC,EAAK,WAEtDC,EAAI,IAAI,WAAW,EAAE,EAG3B,QAASC,EAAS,EAAGA,EAASZ,EAAUY,GAAU,GAAI,CACpD,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAEE,CAAC,EAAIX,EAAG,SAASU,EAASC,EAAI,EAAG,EAAK,EAE1C,QAASA,EAAI,GAAIA,EAAI,GAAIA,IAAK,CAC5B,IAAMC,EAAKtB,EAAK,EAAGmB,EAAEE,EAAI,EAAE,CAAC,EAAIrB,EAAK,GAAImB,EAAEE,EAAI,EAAE,CAAC,EAAKF,EAAEE,EAAI,EAAE,IAAM,EAC/DE,EAAKvB,EAAK,GAAImB,EAAEE,EAAI,CAAC,CAAC,EAAIrB,EAAK,GAAImB,EAAEE,EAAI,CAAC,CAAC,EAAKF,EAAEE,EAAI,CAAC,IAAM,GACnEF,EAAEE,CAAC,EAAKF,EAAEE,EAAI,EAAE,EAAIC,EAAKH,EAAEE,EAAI,CAAC,EAAIE,EAAM,CAC5C,CAEA,IAAIC,EAAIb,EAAIc,EAAIb,EAAIc,EAAIb,EAAIc,EAAIb,EAC5Bc,EAAIb,EAAIc,EAAIb,EAAIc,EAAIb,EAAIc,EAAIb,EAEhC,QAASG,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMW,EAAKhC,EAAK,EAAG4B,CAAC,EAAI5B,EAAK,GAAI4B,CAAC,EAAI5B,EAAK,GAAI4B,CAAC,EAC1CK,EAAML,EAAIC,EAAM,CAACD,EAAIE,EACrBI,EAASH,EAAIC,EAAKC,EAAKlC,GAAEsB,CAAC,EAAIF,EAAEE,CAAC,EAAK,EACtCc,EAAKnC,EAAK,EAAGwB,CAAC,EAAIxB,EAAK,GAAIwB,CAAC,EAAIxB,EAAK,GAAIwB,CAAC,EAC1CY,EAAOZ,EAAIC,EAAMD,EAAIE,EAAMD,EAAIC,EAC/BW,EAASF,EAAKC,EAAO,EAE3BL,EAAID,EAAGA,EAAID,EAAGA,EAAID,EAAGA,EAAKD,EAAIO,EAAS,EACvCP,EAAID,EAAGA,EAAID,EAAGA,EAAID,EAAGA,EAAKU,EAAQG,EAAS,CAC7C,CAEA1B,EAAMA,EAAKa,EAAK,EAAGZ,EAAMA,EAAKa,EAAK,EACnCZ,EAAMA,EAAKa,EAAK,EAAGZ,EAAMA,EAAKa,EAAK,EACnCZ,EAAMA,EAAKa,EAAK,EAAGZ,EAAMA,EAAKa,EAAK,EACnCZ,EAAMA,EAAKa,EAAK,EAAGZ,EAAMA,EAAKa,EAAK,CACrC,CAEA,IAAMO,EAAM,IAAI,WAAW,EAAE,EACvBC,EAAU,IAAI,SAASD,EAAI,MAAM,EACvC,OAAAC,EAAQ,UAAU,EAAG5B,EAAI,EAAK,EAAI4B,EAAQ,UAAU,EAAG3B,EAAI,EAAK,EAChE2B,EAAQ,UAAU,EAAG1B,EAAI,EAAK,EAAI0B,EAAQ,UAAU,GAAIzB,EAAI,EAAK,EACjEyB,EAAQ,UAAU,GAAIxB,EAAI,EAAK,EAAGwB,EAAQ,UAAU,GAAIvB,EAAI,EAAK,EACjEuB,EAAQ,UAAU,GAAItB,EAAI,EAAK,EAAGsB,EAAQ,UAAU,GAAIrB,EAAI,EAAK,EAC1DoB,CACT,CAEO,SAASE,GAAUpC,EAAuB,CAC/C,OAAO,MAAM,KAAKD,EAAOC,CAAK,CAAC,EAC5B,IAAKqB,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,CACZ,CCxEO,IAAMgB,GAAgC,OAAO,OAAO,CACzD,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SACxD,SAAS,SAAS,WAAW,SAAS,SAAS,UAAU,OAAO,QAChE,SAAS,SAAS,SAAS,SAAS,UAAU,SAAS,SAAS,SAChE,QAAQ,UAAU,SAAS,QAAQ,OAAO,SAAS,SAAS,UAC5D,SAAS,SAAS,SAAS,UAAU,SAAS,SAAS,QAAQ,QAC/D,UAAU,OAAO,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,SAC3D,QAAQ,SAAS,SAAS,QAAQ,SAAS,SAAS,QAAQ,SAC5D,SAAS,SAAS,SAAS,UAAU,UAAU,SAAS,QAAQ,QAChE,UAAU,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,OAC5D,QAAQ,OAAO,UAAU,OAAO,QAAQ,QAAQ,QAAQ,QACxD,SAAS,UAAU,SAAS,UAAU,WAAW,UAAU,OAAO,SAClE,OAAO,OAAO,YAAY,UAAU,OAAO,SAAS,QAAQ,QAC5D,SAAS,WAAW,SAAS,SAAS,QAAQ,OAAO,QAAQ,OAC7D,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,SAC1D,QAAQ,UAAU,SAAS,QAAQ,YAAY,QAAQ,UAAU,YACjE,QAAQ,QAAQ,aAAa,SAAS,SAAS,WAAW,OAAO,QACjE,SAAS,OAAO,QAAQ,OAAO,OAAO,OAAO,OAAO,SACpD,QAAQ,WAAW,WAAW,SAAS,UAAU,UAAU,WAAW,YACtE,YAAY,aAAa,aAAa,YAAY,WAAW,WAAW,UAAU,SAClF,UAAU,UAAU,YAAY,UAAU,UAAU,YAAY,OAAO,UACvE,OAAO,MAAM,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAClD,WAAW,UAAU,SAAS,SAAS,UAAU,SAAS,SAAS,UACnE,QAAQ,OAAO,OAAO,QAAQ,QAAQ,SAAS,SAAS,SACxD,QAAQ,QAAQ,SAAS,SAAS,SAAS,SAAS,QAAQ,UAC5D,OAAO,UAAU,WAAW,QAAQ,SAAS,SAAS,SAAS,SAC/D,OAAO,QAAQ,QAAQ,UAAU,SAAS,UAAU,SAAS,QAC7D,QAAQ,QAAQ,YAAY,QAAQ,UAAU,UAAU,SAAS,QACjE,SAAS,OAAO,SAAS,OAAO,UAAU,UAAU,OAAO,QAC3D,SAAS,UAAU,SAAS,QAAQ,SAAS,OAAO,SAAS,SAC7D,QAAQ,QAAQ,QAAQ,WAAW,UAAU,UAAU,SAAS,UAChE,SAAS,SAAS,WAAW,SAAS,SAAS,UAAU,UAAU,QACnE,OAAO,QAAQ,QAAQ,UAAU,OAAO,OAAO,MAAM,QACrD,QAAQ,OAAO,QAAQ,OAAO,QAAQ,WAAW,SAAS,SAC1D,OAAO,QAAQ,QAAQ,QAAQ,WAAW,OAAO,QAAQ,SACzD,SAAS,QAAQ,WAAW,QAAQ,SAAS,SAAS,OAAO,SAC7D,QAAQ,QAAQ,SAAS,SAAS,SAAS,UAAU,OAAO,UAC5D,WAAW,UAAU,WAAW,QAAQ,UAAU,SAAS,SAAS,UACpE,SAAS,WAAW,UAAU,QAAQ,SAAS,SAAS,OAAO,QAC/D,QAAQ,OAAO,OAAO,QAAQ,OAAO,SAAS,SAAS,QACvD,SAAS,OAAO,SAAS,SAAS,SAAS,QAAQ,SAAS,QAC5D,SAAS,OAAO,SAAS,QAAQ,QAAQ,UAAU,SAAS,UAC5D,QAAQ,QAAQ,UAAU,QAAQ,WAAW,OAAO,MAAM,QAC1D,QAAQ,OAAO,UAAU,WAAW,SAAS,SAAS,QAAQ,SAC9D,QAAQ,SAAS,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,OAC1D,QAAQ,QAAQ,OAAO,OAAO,SAAS,SAAS,UAAU,SAC1D,QAAQ,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,UACzD,SAAS,SAAS,SAAS,QAAQ,UAAU,OAAO,OAAO,OAC3D,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAAS,WAAW,QAC/D,OAAO,SAAS,SAAS,SAAS,QAAQ,OAAO,QAAQ,SACzD,QAAQ,OAAO,UAAU,QAAQ,UAAU,WAAW,WAAW,SACjE,OAAO,SAAS,WAAW,SAAS,SAAS,WAAW,OAAO,UAC/D,SAAS,SAAS,UAAU,UAAU,SAAS,QAAQ,YAAY,WACnE,SAAS,UAAU,OAAO,UAAU,UAAU,YAAY,WAAW,WACrE,UAAU,SAAS,SAAS,SAAS,SAAS,QAAQ,SAAS,UAC/D,WAAW,UAAU,SAAS,UAAU,WAAW,UAAU,WAAW,SACxE,UAAU,YAAY,QAAQ,QAAQ,QAAQ,SAAS,SAAS,YAChE,WAAW,SAAS,YAAY,OAAO,SAAS,OAAO,OAAO,QAC9D,OAAO,OAAO,OAAO,QAAQ,WAAW,UAAU,UAAU,YAC5D,UAAU,WAAW,WAAW,WAAW,WAAW,UAAU,QAAQ,WACxE,SAAS,SAAS,OAAO,QAAQ,QAAQ,WAAW,SAAS,QAC7D,QAAQ,QAAQ,SAAS,UAAU,QAAQ,QAAQ,SAAS,UAC5D,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QACtD,QAAQ,UAAU,OAAO,QAAQ,UAAU,SAAS,SAAS,UAC7D,SAAS,SAAS,YAAY,UAAU,UAAU,UAAU,UAAU,SACtE,QAAQ,UAAU,SAAS,UAAU,WAAW,UAAU,SAAS,SACnE,UAAU,SAAS,UAAU,UAAU,SAAS,OAAO,SAAS,SAChE,SAAS,UAAU,SAAS,SAAS,eAAe,UAAU,YAAY,WAC1E,UAAU,WAAW,UAAU,UAAU,WAAW,WAAW,UAAU,WACzE,YAAY,UAAU,UAAU,UAAU,YAAY,UAAU,WAAW,WAC3E,WAAW,WAAW,WAAW,UAAU,UAAU,UAAU,UAAU,UACzE,UAAU,UAAU,UAAU,UAAU,SAAS,WAAW,WAAW,UACvE,YAAY,WAAW,WAAW,UAAU,WAAW,YAAY,UAAU,WAC7E,WAAW,UAAU,UAAU,QAAQ,WAAW,UAAU,UAAU,UACtE,WAAW,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO,QAC3D,UAAU,aAAa,QAAQ,QAAQ,QAAQ,SAAS,SAAS,QACjE,QAAQ,OAAO,UAAU,UAAU,UAAU,SAAS,UAAU,WAChE,WAAW,WAAW,UAAU,SAAS,WAAW,WAAW,WAAW,YAC1E,WAAW,WAAW,UAAU,WAAW,YAAY,WAAW,WAAW,YAC7E,WAAW,WAAW,WAAW,UAAU,UAAU,WAAW,UAAU,UAC1E,UAAU,SAAS,WAAW,UAAU,SAAS,YAAY,WAAW,SACxE,SAAS,UAAU,UAAU,WAAW,UAAU,WAAW,UAAU,YACvE,YAAY,SAAS,OAAO,SAAS,UAAU,WAAW,UAAU,UACpE,QAAQ,SAAS,SAAS,UAAU,QAAQ,UAAU,QAAQ,SAC9D,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QACxD,OAAO,UAAU,OAAO,OAAO,SAAS,QAAQ,SAAS,SACzD,SAAS,SAAS,SAAS,UAAU,SAAS,QAAQ,SAAS,SAC/D,UAAU,OAAO,SAAS,QAAQ,UAAU,UAAU,WAAW,SACjE,UAAU,QAAQ,OAAO,SAAS,QAAQ,QAAQ,UAAU,UAC5D,WAAW,QAAQ,QAAQ,SAAS,WAAW,WAAW,SAAS,SACnE,WAAW,WAAW,SAAS,WAAW,QAAQ,aAAa,UAAU,UACzE,SAAS,aAAa,UAAU,YAAY,UAAU,QAAQ,UAAU,SACxE,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,OAC5D,SAAS,OAAO,WAAW,aAAa,cAAc,aAAa,aAAa,YAChF,WAAW,SAAS,SAAS,UAAU,OAAO,SAAS,QAAQ,MAC/D,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ,WACnD,SAAS,UAAU,UAAU,SAAS,WAAW,SAAS,SAAS,SACnE,QAAQ,OAAO,OAAO,SAAS,QAAQ,SAAS,SAAS,UACzD,WAAW,YAAY,SAAS,SAAS,QAAQ,YAAY,UAAU,YACvE,QAAQ,WAAW,WAAW,SAAS,SAAS,UAAU,SAAS,WACnE,YAAY,SAAS,WAAW,WAAW,UAAU,WAAW,WAAW,UAC3E,UAAU,SAAS,WAAW,aAAa,UAAU,SAAS,UAAU,YACxE,YAAY,UAAU,aAAa,WAAW,YAAY,aAAa,WAAW,WAClF,WAAW,aAAa,SAAS,WAAW,SAAS,YAAY,YAAY,UAC7E,WAAW,YAAY,aAAa,SAAS,YAAY,YAAY,SAAS,YAC9E,YAAY,YAAY,SAAS,UAAU,SAAS,UAAU,WAAW,SACzE,SAAS,YAAY,SAAS,UAAU,WAAW,UAAU,WAAW,QACxE,WAAW,SAAS,UAAU,UAAU,YAAY,UAAU,SAAS,UACvE,UAAU,aAAa,WAAW,YAAY,YAAY,UAAU,WAAW,YAC/E,UAAU,WAAW,UAAU,UAAU,WAAW,YAAY,YAAY,WAC5E,WAAW,cAAc,WAAW,UAAU,UAAU,YAAY,YAAY,cAChF,WAAW,WAAW,WAAW,aAAa,WAAW,UAAU,YAAY,UAC/E,YAAY,YAAY,WAAW,WAAW,WAAW,WAAW,aAAa,YACjF,aAAa,aAAa,eAAe,iBAAiB,aAAa,YAAY,WAAW,cAC9F,WAAW,YAAY,YAAY,YAAY,aAAa,aAAa,YAAY,WACrF,WAAW,YAAY,aAAa,cAAc,SAAS,YAAY,YAAY,cACnF,UAAU,UAAU,WAAW,UAAU,UAAU,UAAU,aAAa,YAC1E,WAAW,YAAY,UAAU,WAAW,WAAW,UAAU,UAAU,WAC3E,SAAS,UAAU,YAAY,UAAU,SAAS,UAAU,UAAU,WACtE,YAAY,SAAS,WAAW,WAAW,UAAU,UAAU,YAAY,WAC3E,WAAW,aAAa,eAAe,eAAe,aAAa,aAAa,gBAAgB,aAChG,YAAY,YAAY,YAAY,SAAS,QAAQ,YAAY,YAAY,YAC7E,WAAW,UAAU,UAAU,UAAU,aAAa,YAAY,UAAU,WAC5E,eAAe,cAAc,aAAa,YAAY,YAAY,aAAa,aAAa,gBAC5F,WAAW,YAAY,aAAa,WAAW,YAAY,YAAY,QAAQ,UAC/E,aAAa,aAAa,YAAY,UAAU,UAAU,SAAS,UAAU,WAC/E,CAAC,EAGYC,GAA2B,OAAO,OAAO,CACpD,SAAS,OAAO,QAAQ,MAAM,QAAQ,QAAQ,OAAO,OACrD,QAAQ,QAAQ,QAAQ,OAAO,OAAO,MAAM,OAAO,OACnD,SAAS,SAAS,UAAU,QAAQ,UAAU,OAAO,SAAS,SAC9D,SAAS,aAAa,WAAW,QAAQ,WAAW,SAAS,SAAS,UACtE,SAAS,WAAW,SAAS,UAAU,SAAS,SAAS,SAAS,YAClE,OAAO,MAAM,OAAO,OAAO,MAAM,QAAQ,QAAQ,OACjD,SAAS,UAAU,SAAS,UAAU,QAAQ,OAAO,UAAU,UAC/D,WAAW,SAAS,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,SAC9D,SAAS,SAAS,SAAS,OAAO,OAAO,SAAS,WAAW,WAC7D,YAAY,WAAW,YAAY,WAAW,QAAQ,SAAS,UAAU,WACzE,aAAa,SAAS,SAAS,QAAQ,WAAW,QAAQ,QAAQ,OAClE,OAAO,UAAU,OAAO,UAAU,QAAQ,UAAU,SAAS,OAC7D,UAAU,SAAS,SAAS,QAAQ,YAAY,OAAO,aAAa,OACpE,UAAU,WAAW,WAAW,UAAU,QAAQ,YAAY,WAAW,YACzE,SAAS,WAAW,QAAQ,SAAS,SAAS,UAAU,UAAU,YAClE,QAAQ,MAAM,OAAO,QAAQ,QAAQ,MAAM,MAAM,SACjD,UAAU,UAAU,UAAU,SAAS,MAAM,QAAQ,MAAM,QAC3D,QAAQ,SAAS,QAAQ,SAAS,UAAU,OAAO,WAAW,QAC9D,SAAS,OAAO,SAAS,SAAS,SAAS,QAAQ,SAAS,WAC5D,QAAQ,SAAS,OAAO,OAAO,OAAO,QAAQ,QAAQ,QACtD,SAAS,QAAQ,UAAU,SAAS,SAAS,OAAO,OAAO,SAC3D,MAAM,OAAO,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAClD,SAAS,SAAS,SAAS,UAAU,UAAU,WAAW,WAAW,WACrE,YAAY,SAAS,QAAQ,QAAQ,SAAS,WAAW,WAAW,cACpE,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,SAAS,WAC1E,SAAS,QAAQ,OAAO,SAAS,QAAQ,QAAQ,OAAO,QACxD,UAAU,UAAU,SAAS,QAAQ,QAAQ,SAAS,QAAQ,QAC9D,QAAQ,MAAM,OAAO,SAAS,SAAS,OAAO,QAAQ,OACtD,YAAY,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,SACzD,SAAS,SAAS,UAAU,UAAU,SAAS,QAAQ,QAAQ,UAC/D,QAAQ,MAAM,QAAQ,MAAM,OAAO,QAAQ,SAAS,UACpD,UAAU,OAAO,OAAO,OAAO,OAAO,SAAS,QAAQ,QACvD,UAAU,QAAQ,WAAW,UAAU,UAAU,QAAQ,QAAQ,SACjE,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,WACnD,SAAS,SAAS,OAAO,SAAS,OAAO,SAAS,OAAO,OACzD,QAAQ,OAAO,QAAQ,UAAU,SAAS,OAAO,QAAQ,SACzD,OAAO,UAAU,SAAS,YAAY,QAAQ,QAAQ,OAAO,MAC7D,OAAO,QAAQ,aAAa,WAAW,OAAO,UAAU,UAAU,SAClE,UAAU,QAAQ,QAAQ,QAAQ,UAAU,UAAU,WAAW,QACjE,QAAQ,UAAU,QAAQ,MAAM,OAAO,QAAQ,aAAa,QAC5D,SAAS,WAAW,SAAS,SAAS,SAAS,SAAS,OAAO,MAC/D,OAAO,SAAS,QAAQ,UAAU,SAAS,QAAQ,OAAO,SAC1D,OAAO,QAAQ,QAAQ,SAAS,QAAQ,UAAU,SAAS,WAC3D,UAAU,WAAW,QAAQ,QAAQ,QAAQ,MAAM,MAAM,OACzD,OAAO,WAAW,QAAQ,OAAO,UAAU,UAAU,SAAS,UAC9D,WAAW,YAAY,YAAY,WAAW,SAAS,UAAU,YAAY,SAC7E,WAAW,OAAO,QAAQ,SAAS,QAAQ,SAAS,UAAU,WAC9D,UAAU,OAAO,QAAQ,QAAQ,UAAU,QAAQ,SAAS,SAC5D,SAAS,YAAY,UAAU,UAAU,SAAS,WAAW,aAAa,WAC1E,cAAc,UAAU,UAAU,YAAY,aAAa,QAAQ,QAAQ,QAC3E,QAAQ,QAAQ,OAAO,OAAO,QAAQ,UAAU,SAAS,SACzD,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,OACnD,OAAO,QAAQ,SAAS,SAAS,UAAU,QAAQ,QAAQ,OAC3D,OAAO,WAAW,SAAS,QAAQ,QAAQ,UAAU,QAAQ,SAC7D,OAAO,QAAQ,OAAO,QAAQ,SAAS,QAAQ,QAAQ,UACvD,QAAQ,SAAS,SAAS,SAAS,QAAQ,QAAQ,SAAS,WAC5D,SAAS,SAAS,QAAQ,OAAO,SAAS,UAAU,UAAU,OAC9D,OAAO,UAAU,SAAS,QAAQ,UAAU,MAAM,QAAQ,SAC1D,SAAS,UAAU,SAAS,WAAW,QAAQ,QAAQ,OAAO,QAC9D,QAAQ,SAAS,SAAS,OAAO,UAAU,QAAQ,QAAQ,SAC3D,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,SAAS,SAC9D,OAAO,QAAQ,SAAS,UAAU,YAAY,UAAU,SAAS,UACjE,QAAQ,WAAW,aAAa,YAAY,SAAS,UAAU,UAAU,SACzE,UAAU,QAAQ,SAAS,SAAS,QAAQ,QAAQ,SAAS,SAC7D,OAAO,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,SACxD,UAAU,SAAS,WAAW,UAAU,aAAa,YAAY,UAAU,QAC3E,SAAS,SAAS,OAAO,OAAO,SAAS,UAAU,WAAW,SAC9D,UAAU,SAAS,QAAQ,QAAQ,YAAY,YAAY,WAAW,SACtE,OAAO,QAAQ,QAAQ,aAAa,YAAY,WAAW,YAAY,WACvE,cAAc,YAAY,UAAU,YAAY,WAAW,cAAc,aAAa,WACtF,cAAc,WAAW,WAAW,UAAU,WAAW,YAAY,YAAY,YACjF,YAAY,UAAU,aAAa,QAAQ,UAAU,YAAY,SAAS,OAC1E,SAAS,UAAU,UAAU,UAAU,UAAU,SAAS,UAAU,UACpE,UAAU,QAAQ,OAAO,OAAO,UAAU,SAAS,WAAW,SAC9D,QAAQ,UAAU,UAAU,OAAO,OAAO,QAAQ,OAAO,QACzD,OAAO,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,OAC/C,QAAQ,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,SACnD,QAAQ,SAAS,SAAS,SAAS,QAAQ,OAAO,SAAS,OAC3D,QAAQ,SAAS,UAAU,OAAO,SAAS,UAAU,UAAU,QAC/D,SAAS,UAAU,UAAU,WAAW,SAAS,SAAS,QAAQ,QAClE,QAAQ,UAAU,QAAQ,QAAQ,OAAO,OAAO,OAAO,UACvD,WAAW,SAAS,UAAU,SAAS,UAAU,UAAU,WAAW,QACtE,UAAU,OAAO,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAC5D,YAAY,UAAU,WAAW,SAAS,QAAQ,SAAS,SAAS,SACpE,YAAY,QAAQ,YAAY,WAAW,UAAU,SAAS,QAAQ,UACtE,QAAQ,UAAU,QAAQ,SAAS,SAAS,WAAW,QAAQ,UAC/D,WAAW,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,aACzD,aAAa,UAAU,OAAO,UAAU,SAAS,YAAY,QAAQ,UACrE,OAAO,QAAQ,SAAS,MAAM,OAAO,QAAQ,QAAQ,QACrD,QAAQ,SAAS,UAAU,YAAY,UAAU,YAAY,WAAW,YACxE,UAAU,SAAS,YAAY,SAAS,QAAQ,QAAQ,SAAS,QACjE,UAAU,SAAS,WAAW,UAAU,UAAU,OAAO,MAAM,MAC/D,OAAO,OAAO,MAAM,WAAW,QAAQ,OAAO,QAAQ,OACtD,SAAS,OAAO,OAAO,UAAU,OAAO,OAAO,OAAO,OACtD,OAAO,SAAS,SAAS,QAAQ,QAAQ,MAAM,QAAQ,QACvD,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,aAAa,WAAW,UAClE,OAAO,MAAM,QAAQ,UAAU,SAAS,YAAY,aAAa,eACjE,eAAe,aAAa,UAAU,WAAW,QAAQ,SAAS,QAAQ,SAC1E,UAAU,QAAQ,QAAQ,OAAO,SAAS,OAAO,QAAQ,SACzD,SAAS,OAAO,MAAM,SAAS,QAAQ,SAAS,QAAQ,SACxD,UAAU,QAAQ,QAAQ,MAAM,WAAW,WAAW,UAAU,WAChE,SAAS,YAAY,UAAU,QAAQ,SAAS,QAAQ,OAAO,OAC/D,OAAO,QAAQ,UAAU,SAAS,QAAQ,OAAO,QAAQ,QACzD,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,OAAO,OACtD,UAAU,WAAW,QAAQ,SAAS,QAAQ,UAAU,WAAW,WACnE,QAAQ,SAAS,SAAS,SAAS,UAAU,YAAY,WAAW,WACpE,QAAQ,QAAQ,WAAW,SAAS,SAAS,UAAU,aAAa,SACpE,UAAU,OAAO,UAAU,UAAU,WAAW,UAAU,aAAa,UACvE,WAAW,UAAU,aAAa,SAAS,SAAS,QAAQ,QAAQ,SACpE,UAAU,UAAU,QAAQ,QAAQ,UAAU,OAAO,QAAQ,SAC7D,QAAQ,QAAQ,QAAQ,SAAS,UAAU,SAAS,UAAU,SAC9D,OAAO,OAAO,SAAS,QAAQ,MAAM,OAAO,OAAO,OACnD,SAAS,OAAO,OAAO,SAAS,SAAS,OAAO,OAAO,SACvD,MAAM,QAAQ,QAAQ,OAAO,SAAS,OAAO,QAAQ,OACrD,QAAQ,QAAQ,OAAO,OAAO,MAAM,QAAQ,SAAS,SACrD,QAAQ,QAAQ,UAAU,SAAS,QAAQ,QAAQ,OAAO,QAC1D,OAAO,OAAO,QAAQ,WAAW,WAAW,WAAW,WAAW,YAClE,cAAc,aAAa,UAAU,SAAS,WAAW,UAAU,aAAa,WAChF,YAAY,aAAa,aAAa,OAAO,WAAW,WAAW,UAAU,QAC7E,aAAa,WAAW,WAAW,UAAU,UAAU,OAAO,SAAS,SACvE,WAAW,OAAO,UAAU,SAAS,QAAQ,WAAW,OAAO,UAC/D,QAAQ,UAAU,OAAO,OAAO,MAAM,WAAW,QAAQ,QACzD,SAAS,SAAS,QAAQ,SAAS,UAAU,aAAa,YAAY,YACtE,WAAW,OAAO,QAAQ,OAAO,OAAO,OAAO,OAAO,QACtD,WAAW,WAAW,SAAS,SAAS,OAAO,QAAQ,aAAa,SACtE,CAAC,EAMYC,GAAsC,OAAO,OACxD,IAAI,IAAY,CAGhB,CAAC,CACH,ECxRA,SAASC,GAAWC,EAA4B,CAC9C,IAAIC,EAAID,EAAO,EACf,MAAO,IAAM,CACXC,EAAKA,EAAI,WAAc,EACvB,IAAI,EAAI,KAAK,KAAKA,EAAKA,IAAM,GAAK,EAAIA,CAAC,EACvC,SAAK,EAAI,KAAK,KAAK,EAAK,IAAM,EAAI,GAAK,CAAC,EAAK,IACpC,EAAK,IAAM,MAAS,GAAK,UACpC,CACF,CAEA,IAAMC,GAAS,YAAY,IAAgB,IAwBpC,SAASC,GACdC,EACAC,EAAqB,UACrBC,EACQ,CACR,IAAMC,EAAKC,EAAeJ,EAAQE,CAAO,EACzC,OAAQD,EAAQ,CACd,IAAK,QACH,OAAOE,EAAG,MACZ,IAAK,UACH,OAAOA,EAAG,KACZ,IAAK,MACH,OAAOA,EAAG,IACZ,IAAK,OACH,OAAOA,EAAG,IACd,CACF,CAMO,SAASC,EACdJ,EACAE,EACiB,CACjB,IAAMG,EAAaH,GAAS,YAAcI,GACpCC,EAAQL,GAAS,OAASM,GAC1BC,EAAUP,GAAS,eAAiBQ,GACpCC,EAAST,GAAS,OAAS,GAAGA,EAAQ,MAAM,IAAMJ,GAElDc,EAAOC,EAAOF,EAASX,CAAM,EAC7Bc,EAAMC,GAAUJ,EAASX,CAAM,EAG/BJ,GACFgB,EAAK,CAAC,GAAK,GAAOA,EAAK,CAAC,GAAK,GAAOA,EAAK,CAAC,GAAK,EAAKA,EAAK,CAAC,KAAO,EAC/DI,EAAMrB,GAAWC,CAAI,EAGvBqB,EAAOZ,EAAW,KAAK,MAAMW,EAAI,EAAIX,EAAW,MAAM,CAAC,EACvDa,EAAQX,EAAM,KAAK,MAAMS,EAAI,EAAIT,EAAM,MAAM,CAAC,EAClD,KAAOE,EAAQ,IAAIQ,EAAOC,CAAK,GAC7BD,EAAOZ,EAAW,KAAK,MAAMW,EAAI,EAAIX,EAAW,MAAM,CAAC,EACvDa,EAAQX,EAAM,KAAK,MAAMS,EAAI,EAAIT,EAAM,MAAM,CAAC,EAIhD,IAAMY,EAAOd,EAAW,KAAK,MAAMW,EAAI,EAAIX,EAAW,MAAM,CAAC,EACvDe,EAAQb,EAAM,KAAK,MAAMS,EAAI,EAAIT,EAAM,MAAM,CAAC,EAG9Cc,EAAgBP,EAAI,MAAM,GAAI,EAAE,EAEhCQ,EAAMpB,GAAS,WAAa,IAElC,MAAO,CACL,MAAOe,EACP,KAAMA,EAAOK,EAAMJ,EACnB,IAAKD,EAAOK,EAAMJ,EAAQ,IAAMG,EAChC,KAAMJ,EAAOK,EAAMJ,EAAQ,IAAMC,EAAOG,EAAMF,EAC9C,UAAWH,EACX,KAAMC,EACN,KAAMJ,EACN,cAAAO,CACF,CACF,CCxGO,SAASE,EAASC,EAAuC,CAC9D,IAAMC,EAAID,EAAI,QAAQ,IAAK,EAAE,EAC7B,MAAO,CACL,SAASC,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC1B,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC1B,SAASA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,CAC5B,CACF,CAEO,SAASC,EAAS,EAAWC,EAAWC,EAAmB,CAChE,MACE,IACA,CAAC,EAAGD,EAAGC,CAAC,EACL,IAAKC,GACJ,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAMA,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CACpB,EACC,KAAK,EAAE,CAEd,CAEO,SAASC,EAAON,EAAaO,EAAM,IAAc,CACtD,GAAM,CAACC,EAAGL,EAAGC,CAAC,EAAIL,EAASC,CAAG,EAC9B,OAAOE,EAASM,GAAK,EAAID,GAAMJ,GAAK,EAAII,GAAMH,GAAK,EAAIG,EAAI,CAC7D,CAEO,SAASE,EAAQT,EAAaO,EAAM,IAAc,CACvD,GAAM,CAACC,EAAGL,EAAGC,CAAC,EAAIL,EAASC,CAAG,EAC9B,OAAOE,EAASM,GAAK,IAAMA,GAAKD,EAAKJ,GAAK,IAAMA,GAAKI,EAAKH,GAAK,IAAMA,GAAKG,CAAG,CAC/E,CAEO,SAASG,EAAMC,EAAWP,EAAW,EAAI,GAAa,CAC3D,GAAM,CAACQ,EAAIC,EAAIC,CAAE,EAAIf,EAASY,CAAC,EACzB,CAACI,EAAIC,EAAIC,CAAE,EAAIlB,EAASK,CAAC,EAC/B,OAAOF,EACLU,GAAMG,EAAKH,GAAM,EACjBC,GAAMG,EAAKH,GAAM,EACjBC,GAAMG,EAAKH,GAAM,CACnB,CACF,CAEO,SAASI,GAAUlB,EAAqB,CAC7C,GAAM,CAACQ,EAAGL,EAAGC,CAAC,EAAIL,EAASC,CAAG,EAC9B,OAAQQ,EAAIL,EAAIC,GAAK,CACvB,CAmBO,SAASe,EAAiBC,EAA6B,CAC5D,IAAMC,EAAKH,GAAUE,CAAI,EACnBE,EAASD,EAAK,IAEdE,EAASd,EAAQW,EAAM,EAAI,EAC3BI,EAASlB,EAAOc,EAAM,GAAI,EAC1BK,EAAUnB,EAAOc,EAAM,GAAI,EAG3B,CAACM,EAAIC,EAAIC,CAAE,EAAI7B,EAASqB,CAAI,EAC9BS,EACJ,GAAIR,EAAK,IAAK,CACZ,IAAMS,EAAKT,EAAK,IAAM,IAAO,IACvBU,EAAKV,EAAK,IAAM,GAAO,IACvBW,EAAKX,EAAK,IAAM,IAAO,IAC7BQ,EAAa3B,EACX,KAAK,IAAI,IAAKwB,EAAKA,EAAKI,CAAE,EAC1B,KAAK,IAAI,EAAGH,EAAKA,EAAKI,CAAE,EACxB,KAAK,IAAI,EAAGH,EAAKA,EAAKI,CAAE,CAC1B,CACF,MACEH,EAAa3B,EACX,KAAK,IAAI,IAAKwB,EAAK,EAAE,EACrB,KAAK,IAAI,EAAGC,EAAK,EAAE,EACnB,KAAK,IAAI,EAAGC,EAAK,CAAC,CACpB,EAEF,IAAMK,EAAe,IAAO,KAAQ,EAAI,KAAK,IAAI,EAAGZ,EAAK,GAAG,GAGtDa,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIb,EAAK,IAAM,GAAG,CAAC,EAC/Cc,EAAUzB,EAAM,UAAW,UAAWwB,CAAI,EAC1CE,EAAW,EAAI,KAAK,IAAIf,EAAK,GAAG,EAAI,GACpCgB,GAAYf,EAAS,GAAO,KAAQ,KAAK,IAAI,EAAGc,CAAQ,EAAI,IAC5DE,EAAS5B,EAAMU,EAAMe,EAAS,KAAK,IAAI,IAAME,CAAQ,CAAC,EACtD,CAACE,EAAIC,EAAIC,CAAE,EAAI1C,EAASuC,CAAM,EAE9BI,EADO,KAAK,IAAIhB,EAAKa,CAAE,EAAI,KAAK,IAAIZ,EAAKa,CAAE,EAAI,KAAK,IAAIZ,EAAKa,CAAE,EAC7C,GAAK/B,EAAMU,EAAMe,EAAS,GAAI,EAAIG,EAGpDK,EAAYrB,EAASb,EAAQW,EAAMC,EAAK,GAAK,IAAO,GAAI,EAAIf,EAAOc,EAAM,GAAI,EAC7EwB,EAAWtB,EAASb,EAAQW,EAAM,EAAI,EAAId,EAAOc,EAAM,EAAI,EAC3DyB,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIxB,EAAK,KAAO,EAAE,CAAC,EAC/CyB,EAAUpC,EAAMD,EAAQW,EAAM,GAAI,EAAGK,EAASoB,CAAI,EAClDE,EAAYzC,EAAOc,EAAM,GAAO,KAAQ,EAAI,KAAK,IAAI,EAAGC,EAAK,GAAG,EAAE,EAClE2B,EAAW1B,EAASb,EAAQW,EAAM,GAAI,EAAId,EAAOc,EAAM,GAAI,EAG3D6B,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI5B,EAAK,IAAM,GAAG,CAAC,EAC9C6B,EAAkBxC,EAAM,UAAW,UAAWuC,CAAG,EAGjDE,EAAS9B,EAAK,IAAM,GAAMA,EAAK,IAAM,GAAM,GAC3C+B,EAAiB1C,EAAM,UAAWA,EAAMU,EAAM,UAAW,EAAG,EAAG+B,CAAM,EAE3E,MAAO,CACL,OAAA5B,EAAQ,OAAAC,EAAQ,QAAAC,EAAS,OAAAH,EACzB,WAAAO,EAAY,aAAAI,EACZ,SAAAS,EAAU,SAAAE,EAAU,UAAAD,EACpB,QAAAG,EAAS,UAAAC,EACT,gBAAAG,EAAiB,SAAAF,EACjB,eAAAI,CACF,CACF,CAGO,SAASC,GAAYC,EAAiBlC,EAAsB,CACjE,GAAM,CAACmC,EAAIC,EAAIC,CAAE,EAAI1D,EAASuD,CAAO,EAC/B,CAAC5B,EAAIC,EAAIC,CAAE,EAAI7B,EAASqB,CAAI,EAClC,OAAO,KAAK,IAAImC,EAAK7B,CAAE,EAAI,KAAK,IAAI8B,EAAK7B,CAAE,EAAI,KAAK,IAAI8B,EAAK7B,CAAE,EAAI,GAC/D,GACA,EACN,CCxHA,SAAS8B,GAAKC,EAAqB,CACjC,IAAIC,EAAO,KACX,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BD,GAASA,GAAQ,GAAKA,EAAOD,EAAI,WAAWE,CAAC,EAAK,EAEpD,OAAOD,IAAS,CAClB,CAIA,SAASE,GACPC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACQ,CACR,GAAIF,EAAM,MAAO,GAEjB,IAAIG,EAAI,SAGR,OAAAA,GAAK,uBAAuBX,CAAE,mCAC9BW,GAAK,iCAAiCT,CAAM,MAC5CS,GAAK,mCAAmCR,CAAM,MAC9CQ,GAAK,oBAGLA,GAAK,uBAAuBX,CAAE,mCAC9BW,GAAK,iCAAiCC,EAAQR,EAAS,GAAI,CAAC,MAC5DO,GAAK,mCAAmCE,EAAOT,EAAS,GAAI,CAAC,MAC7DO,GAAK,oBAGLA,GAAK,uBAAuBX,CAAE,mCAC9BW,GAAK,iCAAiCC,EAAQP,EAAO,GAAI,CAAC,MAC1DM,GAAK,mCAAmCE,EAAOR,EAAO,GAAI,CAAC,MAC3DM,GAAK,oBAEDF,IAEFE,GAAK,uBAAuBX,CAAE,qCAC9BW,GAAK,wDAAwDD,CAAa,MAC1EC,GAAK,8DACLA,GAAK,oBAGLA,GAAK,uBAAuBX,CAAE,qCAC9BW,GAAK,iCAAiCR,CAAM,0BAC5CQ,GAAK,mCAAmCR,CAAM,uBAC9CQ,GAAK,oBAGLA,GAAK,uBAAuBX,CAAE,iCAC9BW,GAAK,iCAAiCL,CAAU,mBAAmBC,EAAa,QAAQ,CAAC,CAAC,MAC1FI,GAAK,mCAAmCL,CAAU,uBAClDK,GAAK,oBAGLA,GAAK,uBAAuBX,CAAE,iCAC9BW,GAAK,iCAAiCL,CAAU,mBAAmBC,EAAa,QAAQ,CAAC,CAAC,MAC1FI,GAAK,mCAAmCL,CAAU,uBAClDK,GAAK,qBAGPA,GAAK,UACEA,CACT,CAIA,SAASG,GAAeC,EAAYf,EAAYQ,EAAuB,CACrE,IAAMQ,EAAOR,EAAO,eAAiB,QAAQR,CAAE,MAC/C,OAAQe,EAAI,CACV,IAAK,GACH,MAAO,YAAYC,CAAI,4DACzB,IAAK,GACH,MAAO,YAAYA,CAAI,4DACzB,IAAK,GACH,MAAO,YAAYA,CAAI,4DACzB,QACE,MAAO,EACX,CACF,CAIA,SAASC,GAAWC,EAAiBC,EAA2B,CAC9D,MACE,gDAAgDD,CAAO,uDACHC,CAAS,iEACbD,CAAO,uDACHC,CAAS,mBAEjE,CAIA,SAASC,GAAWpB,EAAYC,EAAcO,EAAea,EAAkB,EAAW,CACxF,IAAML,EAAOR,EAAOP,EAAO,QAAQD,CAAE,MAC/BsB,EAASD,EAAU,EAAI,aAAaA,CAAO,IAAM,GACvD,MAAO,oEAAoEL,CAAI,IAAIM,CAAM,IAC3F,CAIA,SAASC,GAAmBvB,EAAYQ,EAAuB,CAC7D,OAAIA,EAAa,GAEf,yEAAyER,CAAE,iFACFA,CAAE,+DACpBA,CAAE,6DACFA,CAAE,8HAG7D,CAIA,SAASwB,GAAgBT,EAAYf,EAAYI,EAAiBH,EAAcO,EAAuB,CACrG,IAAMQ,EAAOR,EAAOJ,EAAU,QAAQJ,CAAE,MACxC,OAAQe,EAAI,CACV,IAAK,GAAG,MAAO,GACf,IAAK,GACH,MAAO,uFAAuFC,CAAI,MACpG,IAAK,GACH,MACE,YAAYA,CAAI,uMASpB,IAAK,GACH,MACE,sFAAsFA,CAAI,uDACtCA,CAAI,MAE5D,IAAK,GACH,MAAO,iDAAiDA,CAAI,MAC9D,IAAK,GACH,MAAO,sFAAsFA,CAAI,MACnG,IAAK,GACH,MACE,sFAAsFA,CAAI,6DAChCA,CAAI,6DACJA,CAAI,MAElE,IAAK,GAAG,CACN,IAAMS,EAAMC,GAAYtB,EAASH,CAAI,EACrC,MAAO,mEAAmEG,CAAO,cAAcqB,EAAI,QAAQ,CAAC,CAAC,KAC/G,CACA,IAAK,GACH,MACE,sFAAsFT,CAAI,wDACrCA,CAAI,gGACJA,CAAI,8CAE7D,IAAK,GACH,MACE,uFAAuFA,CAAI,kDAC5CA,CAAI,MAEvD,QAAS,MAAO,EAClB,CACF,CAIA,SAASW,GACPC,EACAC,EACAC,EACAC,EACAtB,EACQ,CAER,IAAIuB,EAAI,GAER,OAAQJ,EAAI,CACV,IAAK,GACHI,GAAK,uCAA4CF,CAAQ,MACzDE,GAAK,eAAe,GAAK,EAAG,2BAA6BH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,kDACtCA,GAAK,uCAA4CF,CAAQ,MACzDE,GAAK,eAAe,GAAK,EAAG,2BAA6BH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,kDACtC,MACF,IAAK,GACHA,GAAK,uCAA4CH,CAAM,MACvDG,GAAK,uCAA4CH,CAAM,MACvD,MACF,IAAK,GACHG,GAAK,oDAAyDF,CAAQ,MACtEE,GAAK,eAAe,GAAK,EAAG,2BAA6BH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,SAAS,GAAI,EAAG,0CACtDA,GAAK,oDAAyDF,CAAQ,MACtEE,GAAK,eAAe,GAAK,EAAG,2BAA6BH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,SAAS,GAAI,EAAG,0CACtD,MACF,IAAK,GACHA,GAAK,uCAA4CF,CAAQ,MACzDE,GAAK,uBAA0B,GAAI,EAAG,mBAAmBH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,kDACtCA,GAAK,uCAA4CF,CAAQ,MACzDE,GAAK,uBAA0B,GAAI,EAAG,mBAAmBH,CAAM,MAC3DpB,IAAMuB,GAAK,eAAe,GAAK,GAAG,kDACtC,MACF,IAAK,GACHA,GAAK,kDAA2DF,CAAQ,MACxEE,GAAK,yCAAkDH,CAAM,MACzDpB,IAAMuB,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,EAAG,SAAS,GAAK,GAAG,SAAS,GAAI,EAAG,aAAaD,CAAQ,iDAC1GC,GAAK,kDAA2DF,CAAQ,MACxEE,GAAK,yCAAkDH,CAAM,MACzDpB,IAAMuB,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,EAAG,SAAS,GAAK,GAAG,SAAS,GAAI,EAAG,aAAaD,CAAQ,iDAC1G,MACF,IAAK,GACHC,GAAK,qDAAgFH,CAAM,gDAC3FG,GAAK,qDAAgFH,CAAM,gDAC3F,MACF,IAAK,GACHG,GAAK,yCAA8CF,CAAQ,MAC3DE,GAAK,eAAe,GAAK,EAAG,yBAA2BH,CAAM,MAC7DG,GAAK,eAAe,GAAK,GAAG,+CACxBvB,IACFuB,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,GAAG,6BAA0CH,CAAM,gDAC1FG,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,GAAG,iBAAwB,GAAI,GAAG,aAAaH,CAAM,iDAE9FG,GAAK,yCAA8CF,CAAQ,MAC3DE,GAAK,eAAe,GAAK,EAAG,yBAA2BH,CAAM,MAC7DG,GAAK,eAAe,GAAK,GAAG,+CACxBvB,IACFuB,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,GAAG,6BAA0CH,CAAM,gDAC1FG,GAAK,aAAa,GAAK,GAAG,SAAS,GAAI,GAAG,iBAAwB,GAAI,GAAG,aAAaH,CAAM,iDAE9F,MACF,IAAK,GACHG,GAAK,oDAAyDF,CAAQ,MACtEE,GAAK,gBAAgB,GAAK,EAAG,qCAAuCH,CAAM,MAC1EG,GAAK,oDAAyDF,CAAQ,MACtEE,GAAK,gBAAgB,GAAK,EAAG,qCAAuCH,CAAM,MAC1E,MACF,QACEG,GAAK,yCAA8CF,CAAQ,MAC3DE,GAAK,eAAe,GAAK,EAAG,yBAA2BH,CAAM,MAC7DG,GAAK,yCAA8CF,CAAQ,MAC3DE,GAAK,eAAe,GAAK,EAAG,yBAA2BH,CAAM,KACjE,CAGA,OAAIpB,GAAQmB,IAAO,GAAKA,IAAO,IAC7BI,GAAK,gBAAuB,GAAI,GAAG,cAA8B,GAAI,GAAG,yBAAyBD,CAAQ,uCACzGC,GAAK,gBAAuB,GAAI,GAAG,cAA8B,GAAI,GAAG,yBAAyBD,CAAQ,wCAGpGC,CACT,CAIA,SAASC,GAAeC,EAAYC,EAA2B,CAE7D,OAAQD,EAAI,CACV,IAAK,GACH,MACE,qCAAqD,GAAI,EAAG,aAAaC,CAAS,kEACtD,GAAI,EAAG,6BAAsCA,CAAS,gDAEtF,IAAK,GACH,MACE,aAAa,GAAK,GAAG,iBAAmB,GAAK,GAAG,qBAAuBA,CAAS,0DACnE,GAAK,GAAG,iBAAmB,GAAK,GAAG,qBAAuBA,CAAS,gDAEpF,IAAK,GACH,MACE,aAAa,GAAK,GAAG,IAAI,GAAI,EAAG,QAAW,GAAI,GAAG,IAAI,GAAK,GAAG,IAAI,GAAI,EAAG,yBAAyBA,CAAS,0DAC9F,GAAK,GAAG,IAAI,GAAI,EAAG,QAAW,GAAI,GAAG,IAAI,GAAK,GAAG,IAAI,GAAI,EAAG,yBAAyBA,CAAS,gDAE/G,IAAK,GACH,MACE,qDAAwFA,CAAS,gGACTA,CAAS,8CAErG,IAAK,GACH,MACE,4DAA2FA,CAAS,iIACTA,CAAS,wEAExG,QACE,MAAO,EACX,CACF,CAIA,SAASC,GAAWC,EAAYC,EAA0B,CAExD,OAAQD,EAAI,CACV,IAAK,GACH,MAAO,kDAAuDC,CAAQ,qBACxE,IAAK,GACH,MAAO,yCAA8CA,CAAQ,oBAC/D,IAAK,GACH,MAAO,qDAAwFA,CAAQ,4DACzG,IAAK,GACH,MACE,eAAe,GAAK,GAAG,2BAA6BA,CAAQ,gCAC7C,GAAK,GAAG,2BAA6BA,CAAQ,oBAEhE,QACE,MAAO,kDAAuDA,CAAQ,oBAC1E,CACF,CAIA,SAASC,GAAYC,EAAYC,EAAkBC,EAAyB,CAE1E,IAAMC,EAAWD,EAAS,UAAY,UACtC,OAAQF,EAAI,CACV,IAAK,GACH,MAAO,qDAAgFC,CAAQ,gDACjG,IAAK,GACH,MAAO,iDAA2EA,CAAQ,gDAC5F,IAAK,GACH,MAAO,qDAAgFA,CAAQ,gDACjG,IAAK,GACH,MAAO,kDAA2DA,CAAQ,oBAC5E,IAAK,GACH,MAAO,6BAA8D,GAAI,GAAG,yBAAyBA,CAAQ,gDAC/G,IAAK,GACH,MACE,uCAAkEE,CAAQ,aAAaF,CAAQ,yCACnE,GAAI,GAAG,iBAAwB,GAAI,GAAG,aAAaA,CAAQ,uCAE3F,IAAK,GACH,MAAO,iDAA2EA,CAAQ,gDAC5F,IAAK,GACH,MACE,kDAA2DA,CAAQ,yCAChC,GAAI,GAAG,+BAAwCA,CAAQ,gDAE9F,QACE,MAAO,qDAAgFA,CAAQ,+CACnG,CACF,CAIA,SAASG,GACPC,EACAC,EACAC,EACAC,EACAC,EACQ,CACR,OAAQJ,EAAI,CACV,IAAK,GAAG,MAAO,GACf,IAAK,GACH,MAAO,mDACT,IAAK,GACH,MACE,0BAA0BE,CAAY,yNAQ1C,IAAK,GACH,MACE,0BAA0BA,CAAY,uPAQ1C,IAAK,GACH,MACE,yCAAyCC,CAAY,0CACdA,CAAY,oBAEvD,IAAK,GACH,MAAO,8DAA8DC,CAAa,qBACpF,IAAK,GACH,MACE,kPASJ,IAAK,GACH,MACE,yCAAyCD,CAAY,4CACZA,CAAY,MAEzD,IAAK,GACH,MACE,0BAA0BD,CAAY,qGAC0CA,CAAY,uGACZA,CAAY,mJAMhG,IAAK,GACH,MACE,maAOJ,QACE,MAAO,EACX,CACF,CAIO,SAASG,EACdC,EACAC,EACQ,CACR,GAAM,CAAE,KAAAC,EAAO,GAAI,MAAAC,EAAO,eAAAC,EAAgB,YAAAC,EAAa,UAAAC,EAAW,eAAAC,CAAe,EAAIN,GAAW,CAAC,EAC3FO,EAASC,EAAeT,EAAeI,CAAc,EAGrDM,EAAYT,GAAS,QAAU,OAC/B3C,EAAOoD,IAAc,QAAWA,IAAc,QAAUR,GAAQ,GAChE7C,EAAO8C,GAAO,MAAQ,GAGtBQ,EAAaR,GAAO,YAAcS,GAClCC,EAAYV,GAAO,WAAaW,GAChCC,EAAaZ,GAAO,YAAca,GAClCC,EAAWd,GAAO,UAAYe,GAE9BpE,EAAOyD,GAAgB,MAAQI,EAAWH,EAAO,UAAYG,EAAW,MAAM,EAC9EjC,EAAS6B,GAAgB,MAAQM,EAAUL,EAAO,SAAWK,EAAU,MAAM,EAC7E5D,EAAUsD,GAAgB,MAAQQ,EAAWP,EAAO,UAAYO,EAAW,MAAM,EACjF7D,EAAQqD,GAAgB,IAAMU,EAAST,EAAO,QAAUS,EAAS,MAAM,EAGvEE,EAAUC,EAAiBtE,CAAI,EAE/BuE,EAAYlB,GAAO,WAAa,EAChCmB,EAAWnB,GAAO,UAAY,EAC9BnB,EAAYuB,GAAgB,SAAWJ,GAAO,cAAgBgB,EAAQ,UACtEhC,EAAWoB,GAAgB,MAAQJ,GAAO,WAAagB,EAAQ,SAC/D7B,EAAWiB,GAAgB,OAASJ,GAAO,YAAcgB,EAAQ,SACjEI,EAAWhB,GAAgB,WAAaJ,GAAO,gBAAkBgB,EAAQ,eACzExC,EAAW4B,GAAgB,UAAYJ,GAAO,eAAiBgB,EAAQ,gBACvEvB,EAAeO,GAAO,cAAgB,UACtCN,EAAeM,GAAO,cAAgBqB,EAAM1E,EAAM,UAAW,EAAG,EAChEgD,EAAgBK,GAAO,eAAiBqB,EAAMvE,EAAS,UAAW,EAAG,EAGrEJ,EAAK,KAAOL,GAAKwD,CAAa,EAAE,SAAS,EAAE,EAG3CyB,EAAetB,GAAO,cAAgB,GACtChD,EAAagD,GAAO,YAAcgB,EAAQ,WAC1C/D,EAAe+C,GAAO,cAAgBgB,EAAQ,aAE9CvD,GAAK4C,EAAO,UAAY,GACxBd,EAAKgC,EAAmBlB,CAAM,EAE9BmB,GAAYrB,EAAY,WAAWA,CAAS,IAAM,GACpDsB,EAAM,sEAAsE1B,CAAI,aAAaA,CAAI,IAAIyB,EAAS,IAG5GpE,GAAgB4C,GAAO,eAAiB,GAC9CyB,GAAOhF,GAAUC,EAAIC,EAAMqE,EAAQ,OAAQA,EAAQ,OAAQlE,EAASC,EAAOC,EAAYC,EAAcC,EAAMC,GAAQmE,EAAclE,EAAa,EAG9I,IAAMsE,EAAe,CAAC,CAACxB,EACjByB,GAAgB,OAAOzB,GAAgB,SAAYA,EAAY,UAAY,EAAK,EAChF0B,GAAa,OAAO1B,GAAgB,SAAYA,EAAY,OAAS,EAAK,EAChF,GAAIwB,EAAc,CAChB,IAAMG,EAAM,MAAMhC,EAAc,MAAM,EAAG,CAAC,CAAC,GACrCiC,GAAWF,GAAa,IAAIA,EAAU,IAAM,GAClDH,GAAO,qBAAqBI,CAAG,sEAAsEA,CAAG,mBAAmBA,CAAG,UAAUF,EAAa,gBAAgBG,EAAQ,+CAC/K,CAGA,IAAMC,GAAS7E,EAAOH,EAAQ,QAAQL,CAAE,MACxC+E,GAAO,kDAAkDM,EAAM,cAAcb,CAAS,SAASC,CAAQ,MAGvGM,GAAOjE,GAAeC,GAAIf,EAAIQ,CAAI,EAGlCuE,GAAO9D,GAAWqD,EAAQ,QAASA,EAAQ,SAAS,EAGpD,IAAMgB,GAAchC,GAAO,aAAe,EAC1CyB,GAAO3D,GAAWpB,EAAIC,EAAMO,EAAM8E,EAAW,EAG7C,IAAMC,GAAgBjC,GAAO,eAAiB,GAc9C,GAbI7C,GAAQmE,GAAgBW,KAC1BR,GAAOxD,GAAmBvB,EAAIQ,CAAI,GAIhCqC,IAAO,IACTkC,GAAOnC,GAAgB,EAAG8B,EAAU3B,EAAcC,EAAcC,CAAa,GAI/E8B,GAAOvD,GAAgBT,GAAIf,EAAII,EAASH,EAAMO,CAAI,EAG9CwE,EAAc,CAChB,IAAMG,EAAM,MAAMhC,EAAc,MAAM,EAAG,CAAC,CAAC,GAC3C4B,GAAO,aAAaI,CAAG,SACzB,CACA,OAAAJ,GAAOpD,GAAWgC,EAAO,SAAW,EAAG9B,EAAQC,EAAUwC,EAAQ,SAAU7D,CAAI,EAC3EuE,IAAcD,GAAO,QAGzBA,GAAO9C,GAAe0B,EAAO,SAAW,EAAGxB,CAAS,EAGpD4C,GAAO3C,GAAWuB,EAAO,KAAO,EAAGrB,CAAQ,EAG3CyC,GAAOxC,GAAYoB,EAAO,MAAQ,EAAGlB,EAAU6B,EAAQ,MAAM,EAGzDzB,IAAO,GAAKA,IAAO,IACrBkC,GAAOnC,GAAgBC,EAAI6B,EAAU3B,EAAcC,EAAcC,CAAa,GAI5EK,GAAO,SACTyB,GAAO,gEAAgEzB,EAAM,OAAO,KAAK,mBAAmBA,EAAM,OAAO,KAAK,SAASmB,CAAQ,OAGjJM,GAAO,SACAA,CACT,CAEO,SAASS,GACdrC,EACAC,EACQ,CACR,IAAM2B,EAAM7B,EAAiBC,EAAeC,CAAO,EACnD,MAAO,oCAAoC,mBAAmB2B,CAAG,CAAC,EACpE,CAEO,SAASU,GACdtC,EACAC,EACQ,CACR,IAAM2B,EAAM7B,EAAiBC,EAAeC,CAAO,EACnD,MAAO,6BAA6B,KAAK2B,CAAG,CAAC,EAC/C,CC3kBA,IAAMW,GAAqC,CACzC,EAAG,YACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,SACH,EAAG,OACH,EAAG,UACH,EAAG,QACH,EAAG,MACL,EAEMC,GAAqC,CACzC,EAAG,mBACH,EAAG,oBACH,EAAG,gBACH,EAAG,sBACH,EAAG,uBACH,EAAG,0BACH,EAAG,uBACH,EAAG,mBACL,EAEMC,GAA0C,CAC9C,EAAG,aACH,EAAG,OACH,EAAG,QACH,EAAG,QACH,EAAG,MACL,EAEMC,GAAyC,CAC7C,EAAG,QACH,EAAG,WACH,EAAG,UACH,EAAG,mBACH,EAAG,gBACL,EAEMC,GAAsC,CAC1C,EAAG,uBACH,EAAG,sBACH,EAAG,qBACH,EAAG,qCACL,EAEMC,GAAuC,CAC3C,EAAG,iBACH,EAAG,6BACH,EAAG,eACH,EAAG,6BACH,EAAG,oBACH,EAAG,sBACH,EAAG,8BACH,EAAG,aACL,EAEMC,GAAsC,CAC1C,EAAG,qBACH,EAAG,6BACH,EAAG,qBACH,EAAG,kBACH,EAAG,oBACH,EAAG,0CACH,EAAG,kBACH,EAAG,mBACH,EAAG,qBACH,EAAG,gBACL,EAEMC,GAA2C,CAC/C,EAAG,YACH,EAAG,iBACH,EAAG,SACH,EAAG,eACH,EAAG,aACH,EAAG,SACH,EAAG,WACH,EAAG,WACH,EAAG,aACH,EAAG,QACL,EAEMC,GAAyC,CAC7C,EAAG,GACH,EAAG,gBACH,EAAG,gBACH,EAAG,sBACH,EAAG,qBACH,EAAG,aACH,EAAG,WACH,EAAG,gBACH,EAAG,qBACH,EAAG,YACL,EAEMC,GAAyC,CAC7C,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,WACH,EAAG,SACH,EAAG,OACL,EAWO,SAASC,EACdC,EACAC,EACQ,CACR,IAAMC,EAASC,EAAeH,CAAa,EACrC,CACJ,kBAAAI,EAAoB,GACpB,OAAAC,EAAS,YACT,YAAAC,EAAc,QACd,KAAAC,CACF,EAAIN,GAAW,CAAC,EAEhB,OAAII,IAAW,aAAqBG,GAAgBN,EAAQE,CAAiB,EACzEC,IAAW,UAAkBI,GAAaP,CAAM,EAC7CQ,GAAeR,EAAQI,EAAaC,EAAMH,CAAiB,CACpE,CAoBA,SAASO,GACPC,EACAC,EACAC,EACAC,EACQ,CACR,IAAMC,EAAkB,CAAC,EACnBC,EAAKC,EAAmBN,CAAC,EAEzBO,EAAUN,IAAgB,QAC3BC,EAAO,OAAOA,CAAI,WAAa,SAC/BA,EAAO,GAAGA,CAAI,OAAS,mBAEtBM,EAAKP,IAAgB,QAAU,MAAQ,UAG7CG,EAAM,KAAK,GAAGG,CAAO,yBAAyBE,GAAWT,EAAE,SAAS,GAAK,MAAM,OAAO,EAGtF,IAAMU,EAAWC,GAAWX,EAAE,QAAQ,GAAK,QACrCY,EAAWC,GAAgBb,EAAE,QAAQ,GAAK,OAChDI,EAAM,KAAK,GAAGM,CAAQ,IAAIE,CAAQ,OAAO,EAGzC,IAAME,EAAQC,GAAef,EAAE,QAAQ,EACnCc,GAAOV,EAAM,KAAK,GAAGU,CAAK,WAAW,EAGzC,IAAME,EAAYC,GAAYjB,EAAE,SAAS,GAAK,GACxCkB,EAAYC,GAAiBnB,EAAE,SAAS,GAAK,GAC/CA,EAAE,YAAc,EAClBI,EAAM,KAAKH,IAAgB,QAAU,cAAgB,aAAa,EACzDe,EAAU,WAAW,IAAI,EAClCZ,EAAM,KAAK,SAASc,CAAS,IAAIF,EAAU,MAAM,CAAC,CAAC,EAAE,EAErDZ,EAAM,KAAK,OAAOc,CAAS,IAAIF,CAAS,EAAE,EAI5C,IAAII,EAAOhB,EAAM,CAAC,EACdA,EAAM,OAAS,EACjBgB,GAAQ,KAAOhB,EAAM,MAAM,EAAG,EAAE,EAAE,KAAK,IAAI,EAAI,KAAOA,EAAMA,EAAM,OAAS,CAAC,EACnEA,EAAM,SAAW,IAC1BgB,GAAQ,QAAUhB,EAAM,CAAC,GAE3BgB,GAAQ,IAGR,IAAMC,EAAOC,GAAYtB,EAAE,IAAI,EAC/B,GAAIqB,EAAM,CACR,IAAME,EAActB,IAAgB,QAChC,UACCC,GAAQ,SAAWA,EAAO,OAAS,SACxCkB,GAAQ,IAAIG,CAAW,IAAIF,CAAI,GACjC,CAGA,IAAMG,EAAMC,GAAepB,CAAE,EACzBmB,IACFJ,GAAQ,IAAIZ,CAAE,YAAYgB,CAAG,KAI/B,IAAME,EAAQC,GAAa3B,EAAE,KAAK,GAAK,UACjC4B,EAAY3B,IAAgB,QAC9B,UACCC,GAAQ,SAAWA,EAAO,OAAS,SAIxC,GAHAkB,GAAQ,IAAIQ,CAAS,IAAIF,CAAK,IAG1BvB,EAAW,CACb,IAAM0B,EAAKC,GAAe9B,EAAE,OAAO,GAAK,WACxCoB,GAAQ,sBAAsBS,CAAE,GAClC,CAEA,OAAOT,CACT,CAEA,SAASW,GAAgB/B,EAAkBG,EAA4B,CACrE,IAAME,EAAKC,EAAmBN,CAAC,EACzBgC,EAAkB,CACtB,iBACA,SAASvB,GAAWT,EAAE,SAAS,GAAK,MAAM,GAC1C,SAASW,GAAWX,EAAE,QAAQ,GAAK,OAAO,KAAKa,GAAgBb,EAAE,QAAQ,GAAK,MAAM,GACpF,aAAae,GAAef,EAAE,QAAQ,GAAK,OAAO,EACpD,EAEMqB,EAAOC,GAAYtB,EAAE,IAAI,EAK/B,GAJIqB,GAAMW,EAAM,KAAK,SAASX,EAAK,QAAQ,MAAO,EAAE,CAAC,EAAE,EAEvDW,EAAM,KAAK,UAAUL,GAAa3B,EAAE,KAAK,GAAK,OAAO,EAAE,EAEnDA,EAAE,YAAc,EAClBgC,EAAM,KAAK,YAAY,MAClB,CACL,IAAMC,EAAKhB,GAAYjB,EAAE,SAAS,GAAK,GACjCkC,EAAKf,GAAiBnB,EAAE,SAAS,GAAK,GAC5CgC,EAAM,KAAK,SAASE,CAAE,IAAID,EAAG,WAAW,IAAI,EAAIA,EAAG,MAAM,CAAC,EAAIA,CAAE,EAAE,CACpE,CAEA,IAAMT,EAAMC,GAAepB,CAAE,EAC7B,OAAImB,GAAKQ,EAAM,KAAK,cAAcR,CAAG,EAAE,EAEnCrB,GACF6B,EAAM,KAAK,eAAeF,GAAe9B,EAAE,OAAO,GAAK,UAAU,EAAE,EAG9DgC,EAAM,KAAK;AAAA,CAAI,CACxB,CAEA,SAASG,GAAanC,EAA0B,CAC9C,IAAMK,EAAKC,EAAmBN,CAAC,EACzBI,EAAkB,CAAC,EAMzB,GAJAA,EAAM,KAAK,eAAe,EAC1BA,EAAM,KAAK,GAAGK,GAAWT,EAAE,SAAS,GAAK,MAAM,OAAO,EACtDI,EAAM,KAAK,GAAGS,GAAgBb,EAAE,QAAQ,GAAK,MAAM,IAAIW,GAAWX,EAAE,QAAQ,GAAK,OAAO,OAAO,EAE3FA,EAAE,YAAc,EAClBI,EAAM,KAAK,MAAM,MACZ,CACL,IAAMgC,EAAMnB,GAAYjB,EAAE,SAAS,GAAK,OAClCiC,EAAKG,EAAI,SAAS,GAAG,EAAIA,EAAI,QAAQ,SAAU,EAAE,EAAIA,EACrDF,EAAKf,GAAiBnB,EAAE,SAAS,GAAK,GAC5CI,EAAM,KAAK,GAAG8B,CAAE,IAAID,EAAG,WAAW,IAAI,EAAIA,EAAG,MAAM,CAAC,EAAIA,CAAE,EAAE,CAC9D,CAEA,IAAMT,EAAMC,GAAepB,CAAE,EAC7B,OAAImB,GAAKpB,EAAM,KAAKoB,CAAG,EAEvBpB,EAAM,MAAMuB,GAAa3B,EAAE,KAAK,GAAK,WAAW,QAAQ,MAAO,EAAE,CAAC,EAE3DI,EAAM,KAAK,IAAI,CACxB,CAIO,SAASiC,GAAeC,EAA+B,CAC5D,MAAO,mBAAmBC,EAAmBD,EAAe,CAAE,OAAQ,UAAW,kBAAmB,EAAM,CAAC,CAAC,EAC9G,CAIO,SAASE,GACdF,EACAG,EACQ,CACR,IAAMrB,EAAOmB,EAAmBD,EAAe,CAC7C,YAAa,QACb,KAAMG,EACN,kBAAmB,GACnB,OAAQ,WACV,CAAC,EAID,MAAO,gDAFOC,GAAWJ,CAAa,IAAM,GAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAEjB,qCAAqClB,CAAI,gGACrG,CAGA,SAASsB,GAAWC,EAAqB,CACvC,IAAIC,EAAO,KACX,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BD,GAASA,GAAQ,GAAKA,EAAOD,EAAI,WAAWE,CAAC,EAAK,EAEpD,OAAOD,IAAS,CAClB,CClUO,IAAME,GAA6B,CAAC,EAI9BC,GAA0B,CACrC,SAAU,CAAC,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAAS,EAChE,cAAe,UACf,UAAW,EACX,SAAU,EACV,OAAQ,CAAE,MAAO,UAAW,MAAO,EAAI,CACzC,EAEaC,GAA2B,CACtC,SAAU,CAAC,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAAS,EAChE,UAAW,EACX,SAAU,CACZ,EAEaC,GAA0B,CACrC,WAAY,CAAC,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAAS,EAClE,UAAW,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,MAAM,EAClD,WAAY,CAAC,UAAW,UAAW,UAAW,OAAQ,UACzC,OAAQ,UAAW,UAAW,UAAW,SAAS,EAC/D,SAAU,CAAC,UAAW,UAAW,UAAW,UAAW,UAC5C,UAAW,UAAW,UAAW,UAAW,SAAS,EAChE,WAAY,OACZ,aAAc,OACd,eAAgB,OAChB,cAAe,UACf,UAAW,GACX,SAAU,CACZ,EAEaC,GAA0B,CACrC,KAAM,EACR,EAEaC,GAAiC,CAC5C,KAAM,GACN,UAAW,CACb,EAIaC,GAA2B,CACtC,UAAW,IACX,SAAU,GACV,OAAQ,GACR,YAAa,GACb,UAAW,IACX,aAAc,IACd,WAAY,sBACZ,eAAgB,IAChB,aAAc,EACd,aAAc,yBACd,iBAAkB,IAClB,eAAgB,sBAChB,aAAc,GACd,YAAa,IACb,cAAe,IACf,QAAS,6BACX,EAEaC,GAA+B,CAC1C,UAAW,GACX,SAAU,GACV,OAAQ,GACR,YAAa,GACb,UAAW,EACX,aAAc,IACd,WAAY,gBACZ,eAAgB,IAChB,aAAc,EACd,aAAc,yBACd,iBAAkB,IAClB,eAAgB,sBAChB,aAAc,GACd,YAAa,IACb,cAAe,IACf,QAAS,6BACX,EAIaC,GAA2B,CACtC,KAAM,GACN,OAAQ,GACR,cAAe,GACf,cAAe,GACf,cAAe,GACf,mBAAoB,OACpB,mBAAoB,CACtB,EAEaC,GAAgC,CAC3C,KAAM,GACN,OAAQ,GACR,cAAe,GACf,cAAe,GACf,cAAe,GACf,mBAAoB,OACpB,mBAAoB,EACpB,gBAAiB,GACjB,sBAAuB,GACvB,sBAAuB,EACvB,aAAc,GACd,kBAAmB,kBACnB,mBAAoB,CACtB,EAEaC,GAAgC,CAC3C,KAAM,GACN,OAAQ,GACR,cAAe,GACf,cAAe,GACf,cAAe,EACjB,EAIaC,EAA8C,CACzD,QAASX,GACT,KAAMC,GACN,MAAOC,GACP,KAAMC,GACN,KAAMC,GACN,YAAaC,GACb,MAAOC,GACP,UAAWC,GACX,MAAOC,GACP,WAAYC,GACZ,WAAYC,EACd,EAEO,SAASE,GACdC,EACAC,EACc,CACd,IAAMC,EAAOJ,EAAcE,CAAI,EAC/B,OAAKE,EACED,EAAY,CAAE,GAAGC,EAAM,GAAGD,CAAU,EAAIC,EAD5BD,GAA8B,CAAC,CAEpD,CR7HA,SAASE,GACPC,EACAC,EACAC,EACY,CACZ,IAAMC,EAAK,OAAOH,GAAY,SAC1B,SAAS,cAA2BA,CAAO,EAC3CA,EAEJ,OAAKG,GAKLA,EAAG,UAAYC,EAAiBH,EAAeC,CAAO,EAC/C,IAAM,CAAEC,EAAG,UAAY,EAAI,IALhC,QAAQ,KAAK,iCAAiCH,CAAO,EAAE,EAChD,IAAM,CAAC,EAKlB,CAEA,SAASK,GACPC,EACAL,EACAC,EACM,CACN,IAAMC,EAAK,OAAOG,GAAQ,SACtB,SAAS,cAAgCA,CAAG,EAC5CA,EAECH,IACLA,EAAG,IAAMI,GAAqBN,EAAeC,CAAO,EACpDC,EAAG,IAAMK,GAAeP,CAAa,EACvC,CAEA,SAASQ,GAASC,EAA+B,SAAgB,CAC9CA,EAAK,iBAA8B,gBAAgB,EAC3D,QAASP,GAAO,CACvB,IAAMQ,EAASR,EAAG,aAAa,cAAc,EAC7C,GAAI,CAACQ,EAAQ,OAEb,IAAMC,EAAO,SAAST,EAAG,aAAa,mBAAmB,GAAK,KAAM,EAAE,EAChEU,EAAQV,EAAG,aAAa,oBAAoB,IAAM,OAClDW,EAAYX,EAAG,aAAa,oBAAoB,EAChDY,EAAOZ,EAAG,aAAa,mBAAmB,IAAM,OAChDa,EAASb,EAAG,aAAa,qBAAqB,EAEhDc,EAAQH,GAAaA,KAAaI,EAClCA,EAAcJ,CAAuC,EACrD,OAEAC,GAAQE,EACVA,EAAQ,CAAE,GAAGA,EAAO,KAAM,EAAK,EACtBF,IACTE,EAAQ,CAAE,KAAM,EAAK,GAGvBlB,GAAaI,EAAIQ,EAAQ,CACvB,KAAAC,EACA,YAAaC,EACb,MAAAI,EACA,OAAQD,GAAU,MACpB,CAAC,CACH,CAAC,CACH,CAIA,IAAMG,GAAW,CAEf,eAAAC,EACA,WAAAC,GACA,eAAAC,EACA,eAAAC,GACA,UAAAC,GACA,aAAAC,GACA,mBAAAC,EAGA,UAAWtB,EACX,cAAeG,GACf,aAAcoB,GAGd,SAAUC,EACV,QAASpB,GACT,YAAaqB,GAGb,MAAO9B,GACP,OAAQM,GACR,SAAAI,GAGA,OAAQS,EACR,SAAUY,GAGV,OAAQ,CAAE,SAAAC,EAAU,SAAAC,EAAU,OAAAC,EAAQ,QAAAC,EAAS,MAAAC,EAAO,UAAAC,GAAW,iBAAAC,CAAiB,CACpF,EAGI,OAAO,OAAW,MACnB,OAA8C,SAAWlB,IAIxD,OAAO,SAAa,MAClB,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAM,CAC9C,SAAS,cAAc,gBAAgB,GACzCV,GAAS,CAEb,CAAC,EAEG,SAAS,cAAc,gBAAgB,GACzCA,GAAS,GAKf,IAAO6B,GAAQnB","names":["cdn_exports","__export","cdn_default","SKIN_COLORS","EYE_COLORS","HAIR_COLORS","BG_COLORS","djb2","str","hash","i","mulberry32","seed","s","generateTraits","walletAddress","overrides","rand","traits","effectiveAccessory","ai","hi","FACE_LABELS","SKIN_LABELS","EYE_STYLE_LABELS","EYE_COLOR_LABELS","BROW_LABELS","NOSE_LABELS","MOUTH_LABELS","HAIR_STYLE_LABELS","HAIR_COLOR_LABELS","ACCESSORY_LABELS","BG_COLOR_LABELS","getTraitLabels","traitHash","resolveTheme","themeName","themes","K","rotr","n","x","sha256","input","msg","bitLen","padLen","totalLen","buf","dv","h0","h1","h2","h3","h4","h5","h6","h7","W","offset","i","s0","s1","a","b","c","d","e","f","g","h","S1","ch","temp1","S0","maj","temp2","out","outView","sha256Hex","ADJECTIVES","NOUNS","BLOCKED_COMBOS","mulberry32","seed","a","DOMAIN","deriveName","wallet","format","options","id","deriveIdentity","adjectives","ADJECTIVES","nouns","NOUNS","blocked","BLOCKED_COMBOS","domain","hash","sha256","hex","sha256Hex","rng","adj1","noun1","adj2","noun2","discriminator","sep","hexToRgb","hex","h","rgbToHex","g","b","v","darken","pct","r","lighten","blend","a","r1","g1","b1","r2","g2","b2","luminance","deriveSkinColors","skin","sL","isDark","skinHi","skinLo","skinMid","sr","sg","sb","cheekColor","rB","gD","bD","cheekOpacity","lipT","lipBase","midBoost","lipBlend","lipRaw","lr","lg","lb","lipColor","browColor","noseFill","earT","earFill","earShadow","lidColor","ewT","eyeWhiteAdapted","warmth","accessoryColor","buzzOpacity","hairCol","hr","hg","hb","djb2","str","hash","i","buildDefs","id","skin","skinHi","skinLo","hairCol","bgCol","cheekColor","cheekOpacity","flat","full","glowIntensity","d","lighten","darken","renderHairBack","hi","fill","renderEars","earFill","earShadow","renderFace","opacity","opAttr","renderFaceOverlays","renderHairFront","bOp","buzzOpacity","renderEyes","ei","eyeCol","eyeWhite","lidColor","s","renderEyebrows","bi","browColor","renderNose","ni","noseFill","renderMouth","mi","lipColor","isDark","teethCol","renderAccessory","ai","accessoryColor","glassesColor","earringColor","headbandColor","renderSolFaceSVG","walletAddress","options","size","theme","traitOverrides","enableBlink","className","colorOverrides","traits","generateTraits","detailOpt","skinColors","SKIN_COLORS","eyeColors","EYE_COLORS","hairColors","HAIR_COLORS","bgColors","BG_COLORS","derived","deriveSkinColors","bgOpacity","bgRadius","accColor","blend","cheekEnabled","effectiveAccessory","classAttr","svg","blinkEnabled","blinkDuration","blinkDelay","uid","delayStr","bgFill","skinOpacity","shadowEnabled","renderSolFaceDataURI","renderSolFaceBase64","SKIN_TONES","EYE_STYLES","EYE_COLORS_DESC","EYEBROW_STYLES","NOSE_STYLES","MOUTH_STYLES","HAIR_STYLES","HAIR_COLORS_DESC","ACCESSORY_DESC","BG_COLORS_DESC","describeAppearance","walletAddress","options","traits","generateTraits","includeBackground","format","perspective","name","buildStructured","buildCompact","buildParagraph","buildParagraph","t","perspective","name","includeBg","parts","ai","effectiveAccessory","subject","im","SKIN_TONES","eyeStyle","EYE_STYLES","eyeColor","EYE_COLORS_DESC","brows","EYEBROW_STYLES","hairStyle","HAIR_STYLES","hairColor","HAIR_COLORS_DESC","desc","nose","NOSE_STYLES","noseSubject","acc","ACCESSORY_DESC","mouth","MOUTH_STYLES","mouthVerb","bg","BG_COLORS_DESC","buildStructured","lines","hs","hc","buildCompact","raw","solFaceAltText","walletAddress","describeAppearance","agentAppearancePrompt","agentName","djb2Simple","str","hash","i","defaultTheme","darkTheme","lightTheme","monoTheme","flatTheme","transparentTheme","glassTheme","glassDarkTheme","pixelTheme","pixelRetroTheme","pixelCleanTheme","PRESET_THEMES","getPresetTheme","name","overrides","base","mountSolFace","element","walletAddress","options","el","renderSolFaceSVG","setSolFaceImg","img","renderSolFaceDataURI","solFaceAltText","autoInit","root","wallet","size","blink","themeName","flat","detail","theme","PRESET_THEMES","SolFaces","generateTraits","deriveName","deriveIdentity","getTraitLabels","traitHash","resolveTheme","effectiveAccessory","renderSolFaceBase64","describeAppearance","agentAppearancePrompt","getPresetTheme","hexToRgb","rgbToHex","darken","lighten","blend","luminance","deriveSkinColors","cdn_default"]}
|