@bergetai/ui 0.5.0 → 0.6.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/neural-flow/NeuralFlow.tsx","../src/components/neural-flow/mnist-samples.ts","../src/components/neural-flow/sparse-weights.ts"],"sourcesContent":["/* cspell:disable */\nimport { Canvas, useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useMemo, useRef, type CSSProperties, type FC, type RefObject } from 'react';\nimport * as THREE from 'three';\nimport { MNIST_SAMPLES } from './mnist-samples';\nimport { SPARSE_WEIGHTS } from './sparse-weights';\n\n/**\n * NeuralFlow — AI inference, rendered live.\n *\n * An MLP in the shape of a classic MNIST classifier (784-256-128-64-10)\n * floats in the Berget green, layer plane after plane receding into the\n * depth. Tokens — signal packets — travel edge to edge through the net;\n * every hop a weight attenuates them (they fade) or amplifies them\n * (they swell bright), until a sample rolls the whole way through and\n * the predicted output node blooms white-green. A CPU sim drives the\n * state (1.2k nodes, ~1.8k live tokens is trivial arithmetic per\n * frame); three.js only paints points, lines and a fog plane — which\n * keeps this Safari-safe with zero float-FBO involvement.\n *\n * Props: every visual knob is a plain number prop read each frame —\n * exposure, focus/blurK depth-of-field, sim speed (a true timeline:\n * 0 pauses pixel-for-pixel, 0.2 is dream's pace), token intensity and\n * camera drift. Reduced motion paints one deterministic still.\n */\n\n// ---------------------------------------------------------------- layout ---\n\nconst LAYER_SIZES = [784, 256, 128, 64, 10] as const;\nconst LAYER_GRID: [rows: number, cols: number][] = [\n [28, 28],\n [16, 16],\n [16, 8],\n [8, 8],\n [10, 1],\n];\nconst LAYER_X = 1.35; // camera-to-plane spacing along the stack axis\nconst CELL = 0.05; // world units between neighbours in a plane\nconst TOKEN_POOL = 1800;\nconst SAMPLE_INTERVAL = 6.5; // seconds between input samples\nconst SAMPLE_WINDOW = 2.6; // sample emission window — long enough to paint the numeral\nconst SAMPLE_RATE = 420; // tokens/second during a sample (x intensity)\nconst TRICKLE_RATE = 40; // idle tokens/second\nconst CLASSES = 10;\n\nexport type NeuralFlowOrientation = 'horizontal' | 'vertical';\n\n/** Classic 5x7 numerals — the actual \"images\" the net sees per class. */\nconst DIGITS: string[][] = [\n ['.###.', '#...#', '#..##', '#.#.#', '##..#', '#...#', '.###.'],\n ['..#..', '.##..', '..#..', '..#..', '..#..', '..#..', '#####'],\n ['.###.', '#...#', '....#', '...#.', '..#..', '.#...', '#####'],\n ['#####', '...#.', '..#..', '...#.', '....#', '#...#', '.###.'],\n ['...#.', '..##.', '.#.#.', '#..#.', '#####', '...#.', '...#.'],\n ['#####', '#....', '####.', '....#', '....#', '#...#', '.###.'],\n ['..##.', '.#...', '#....', '####.', '#...#', '#...#', '.###.'],\n ['#####', '....#', '...#.', '..#..', '.#...', '.#...', '.#...'],\n ['.###.', '#...#', '#...#', '.###.', '#...#', '#...#', '.###.'],\n ['.###.', '#...#', '#...#', '.####', '....#', '...#.', '.##..'],\n];\n\nconst PALETTE = {\n deep: [0.027, 0.235, 0.2] as const,\n mid: [0.051, 0.42, 0.322] as const,\n crest: [0.137, 0.627, 0.36] as const,\n slate: [0.12, 0.17, 0.19] as const,\n white: [0.85, 1.0, 0.9] as const,\n};\n\n/** The dark well behind the fog plane, in brand tokens — the gradient\n the raw canvas painted under itself. Requires the package's\n styles (dist/styles/index.css), like every themed component here. */\nconst BACKDROP =\n 'radial-gradient(120% 95% at 28% 58%, var(--berget-brand-moss-900) 0%, var(--berget-brand-moss-950) 55%, var(--berget-brand-granite-950) 100%)';\n\n// ---------------------------------------------------------------- rng ------\n\nfunction mulberry32(seed: number) {\n let a = seed >>> 0;\n return () => {\n a |= 0;\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\n// ------------------------------------------------------------- network -----\n\ntype Network = {\n /** Flat node positions, xyz per node. */\n positions: Float32Array;\n nodeCount: number;\n layerStart: number[]; // first flat index of each layer\n /** For each node: outgoing targets [dstFlatIndex, weight] pairs. */\n out: { dst: number[]; w: number[] }[];\n /** For each node: incoming edges (needed for the forward pass). */\n inEdges: { src: number; w: number }[][];\n /** Static line segments between connected nodes, xyz per vertex. */\n edgePositions: Float32Array;\n /** Per-vertex edge weight, mirrored into the line shader. */\n edgeWeights: Float32Array;\n edgeCount: number;\n};\n\nexport type InputBlob = { i: number; w: number }[];\n/** One entry per class; each holds that class's candidate input cells. */\nexport type ClassBlobs = InputBlob[];\n\nfunction buildNetwork(seed: number, orientation: NeuralFlowOrientation): Network {\n const rng = mulberry32(seed);\n const nodeCount = LAYER_SIZES.reduce((a, b) => a + b, 0);\n const positions = new Float32Array(nodeCount * 3);\n const layerStart: number[] = [];\n let flat = 0;\n\n LAYER_SIZES.forEach((size, li) => {\n layerStart.push(flat);\n const [rows, cols] = LAYER_GRID[li]!;\n for (let i = 0; i < size; i++) {\n const r = Math.floor(i / cols);\n const c = i % cols;\n const o = flat * 3;\n if (orientation === 'vertical') {\n // Upright stack: layers rise in +Y, each plane a floor slab in X-Z.\n positions[o] = (c - (cols - 1) / 2) * CELL;\n positions[o + 1] = li * LAYER_X;\n positions[o + 2] = (r - (rows - 1) / 2) * CELL;\n } else {\n positions[o] = li * LAYER_X;\n positions[o + 1] = (r - (rows - 1) / 2) * CELL;\n positions[o + 2] = (c - (cols - 1) / 2) * CELL;\n }\n flat++;\n }\n });\n\n // Sparse random inter-layer connectivity — fan-in per node, mostly\n // excitatory weights with a minority of inhibitory ones; weakly\n // 1/sqrt(fanIn) normalised like a real init.\n const fanIn = [0, 9, 10, 10, 7]; // sources per node, per layer\n const inEdges: { src: number; w: number }[][] = [];\n for (let i = 0; i < nodeCount; i++) inEdges.push([]);\n for (let li = 1; li < LAYER_SIZES.length; li++) {\n const srcBase = layerStart[li - 1]!;\n const dstBase = layerStart[li]!;\n for (let d = 0; d < LAYER_SIZES[li]!; d++) {\n const k = fanIn[li]!;\n for (let e = 0; e < k; e++) {\n const src = srcBase + Math.floor(rng() * LAYER_SIZES[li - 1]!);\n const excitatory = rng() < 0.85;\n // Excitatory weights amplify (0.75-1.65) so a signal can really\n // SURVIVE end-to-end; inhibitory ones bleed a token hard.\n const w = excitatory ? 0.75 + 0.9 * rng() : -(0.35 + 0.35 * rng());\n inEdges[dstBase + d]!.push({ src, w });\n }\n }\n }\n\n // Transpose to outgoing lists + build static line geometry.\n const out: { dst: number[]; w: number[] }[] = [];\n for (let i = 0; i < nodeCount; i++) out.push({ dst: [], w: [] });\n let edgeCount = 0;\n for (let d = 0; d < nodeCount; d++) edgeCount += inEdges[d]!.length;\n const edgePositions = new Float32Array(edgeCount * 2 * 3);\n const edgeWeights = new Float32Array(edgeCount * 2);\n let eo = 0;\n for (let d = 0; d < nodeCount; d++) {\n for (const e of inEdges[d]!) {\n out[e.src]!.dst.push(d);\n out[e.src]!.w.push(e.w);\n edgePositions[eo * 6] = positions[e.src * 3]!;\n edgePositions[eo * 6 + 1] = positions[e.src * 3 + 1]!;\n edgePositions[eo * 6 + 2] = positions[e.src * 3 + 2]!;\n edgePositions[eo * 6 + 3] = positions[d * 3]!;\n edgePositions[eo * 6 + 4] = positions[d * 3 + 1]!;\n edgePositions[eo * 6 + 5] = positions[d * 3 + 2]!;\n const a = Math.min(1, Math.abs(e.w) * 1.6);\n edgeWeights[eo * 2] = a;\n edgeWeights[eo * 2 + 1] = a;\n eo++;\n }\n }\n\n return {\n positions,\n nodeCount,\n layerStart,\n out,\n inEdges,\n edgePositions,\n edgeWeights,\n edgeCount,\n };\n}\n\n// ------------------------------------------------------------------ sim ----\n\ntype Token = {\n src: number;\n dst: number;\n w: number;\n layer: number; // source layer index\n t: number; // 0..1 along the edge\n rate: number; // t units per second\n gain: number;\n pos: [number, number, number];\n};\n\nexport class FlowSim {\n private net: Network;\n private blobs: ClassBlobs[];\n private images: Float32Array[][];\n private trained: { w: Float32Array[]; b: Float32Array[] };\n /** Per-node energy of the CURRENT sample's real forward pass; decays\n after the sample window. */\n private energy: Float32Array;\n private predictedClass = 0;\n private act: Float32Array;\n private rng = mulberry32(0xc0ffee);\n private tokens: (Token | null)[] = [];\n private time = 0;\n private nextSample = 0.8;\n private sampleUntil = -10; // far past\n private sampleClass = 0;\n private sampleVariant = 0;\n private emitAcc = 0;\n readonly nodeAttr: Float32Array;\n readonly tokenPos: Float32Array;\n readonly tokenGain: Float32Array;\n\n constructor(\n seed = 1337,\n orientation: NeuralFlowOrientation = 'horizontal',\n blobs: ClassBlobs[] = glyphBlobs(),\n images: Float32Array[][] = [],\n trained: { w: Float32Array[]; b: Float32Array[] } = decodeWeights(),\n ) {\n this.net = buildNetwork(seed, orientation);\n attachWeights(this.net, trained);\n this.blobs = blobs;\n this.images = images;\n this.trained = trained;\n this.energy = new Float32Array(this.net.nodeCount);\n this.act = new Float32Array(this.net.nodeCount);\n this.nodeAttr = new Float32Array(this.net.nodeCount);\n this.tokenPos = new Float32Array(TOKEN_POOL * 3);\n this.tokenGain = new Float32Array(TOKEN_POOL);\n for (let i = 0; i < TOKEN_POOL; i++) this.tokens.push(null);\n }\n\n get network() {\n return this.net;\n }\n\n /** Advance the whole inference world by dt seconds (clamped internally). */\n step(dt: number, intensity: number) {\n dt = Math.min(dt, 0.12);\n this.time += dt;\n\n // Activation half-lives: mid-net ~0.8 s (0.42^dt); input ~1.4 s\n // (0.6^dt) so the numeral stays readable while it feeds; output\n // ~0.6 s (0.3^dt) so the column flickers with live traffic while\n // the continuously re-fed prediction still dominates.\n const decay = Math.pow(0.42, dt);\n const inDecay = Math.pow(0.6, dt);\n const outDecay = Math.pow(0.3, dt);\n const inEnd = this.net.layerStart[1]!;\n const outStart = this.net.layerStart[LAYER_SIZES.length - 1]!;\n for (let i = 0; i < this.act.length; i++) {\n this.act[i] = this.act[i]! * (i >= outStart ? outDecay : i < inEnd ? inDecay : decay);\n }\n\n // Sample scheduling: enter the emission window, pick the class.\n if (this.time >= this.nextSample) {\n this.sampleClass = Math.floor(this.rng() * CLASSES);\n const variants = this.blobs[this.sampleClass]!;\n this.sampleVariant = Math.floor(this.rng() * variants.length);\n this.sampleUntil = this.time + SAMPLE_WINDOW;\n this.nextSample = this.time + SAMPLE_INTERVAL;\n // The REAL forward pass: energy per node for this exact image,\n // and which class the net actually predicts (honest misses and all).\n const { predicted, energy } = forwardPass(\n this.net,\n this.trained,\n this.imageOf(this.sampleClass, this.sampleVariant),\n );\n this.predictedClass = predicted;\n this.energy = energy;\n }\n\n // The last sample's energy fades once its window ends.\n const fade = Math.pow(0.55, dt);\n if (this.time > this.sampleUntil) {\n for (let i = 0; i < this.energy.length; i++) this.energy[i] = this.energy[i]! * fade;\n }\n\n // Token injection — sample burst from its class blob, plus an\n // ever-present idle trickle so the net never looks dead.\n const inSample = this.time < this.sampleUntil;\n const rate = (inSample ? SAMPLE_RATE : TRICKLE_RATE) * intensity;\n\n this.emitAcc += rate * dt;\n while (this.emitAcc >= 1) {\n this.emitAcc -= 1;\n this.inject(inSample);\n }\n\n // Advance tokens, fire arrivals, hand on the baton or bury it.\n for (let i = 0; i < TOKEN_POOL; i++) {\n const tok = this.tokens[i];\n if (!tok) continue;\n tok.t += tok.rate * dt;\n const p = this.net.positions;\n const s3 = tok.src * 3;\n const d3 = tok.dst * 3;\n const t = Math.min(tok.t, 1);\n tok.pos = [\n p[s3]! + (p[d3]! - p[s3]!) * t,\n p[s3 + 1]! + (p[d3 + 1]! - p[s3 + 1]!) * t,\n p[s3 + 2]! + (p[d3 + 2]! - p[s3 + 2]!) * t,\n ];\n if (tok.t < 1) continue;\n\n // Arrival: EVERY deposit lights its node, everywhere in the net.\n // The output layer keeps a soft one-hot read — the net's OWN\n // prediction blooms high above the rest, which shimmer with the\n // live traffic like any other layer.\n const isFinal = tok.layer === LAYER_SIZES.length - 2;\n let pulse = tok.gain * 0.55;\n if (isFinal) {\n const c = tok.dst - this.net.layerStart[LAYER_SIZES.length - 1]!;\n if (c === this.predictedClass) pulse *= 3.8;\n }\n this.act[tok.dst] = Math.min(2, Math.max(-2, this.act[tok.dst]! + pulse));\n\n // Hop gating: during a sample the forward energy decides how much\n // signal THIS node holds — hot routes carry on, dead routes fade.\n // Between samples the idle trickle wanders freely, so the net\n // never looks dead.\n const energyHere = this.energy[tok.dst]!;\n if (inSample && !isFinal && energyHere < 0.1 && this.rng() < 0.7) {\n this.tokens[i] = null; // route is cold for this image\n continue;\n }\n const gain = Math.min(0.25 + 1.6 * energyHere, 2.4);\n if (isFinal) {\n this.tokens[i] = null; // dissolved in the output\n continue;\n }\n // Hand the signal on through a random outgoing edge.\n const outs = this.net.out[tok.dst]!;\n if (outs.dst.length === 0) {\n this.tokens[i] = null;\n continue;\n }\n const pick = Math.floor(this.rng() * outs.dst.length);\n tok.src = tok.dst;\n tok.dst = outs.dst[pick]!;\n tok.w = outs.w[pick]!;\n tok.layer += 1;\n tok.t = 0;\n const len = edgeLen(this.net.positions, tok.src, tok.dst);\n tok.rate = (1.35 / Math.max(len, 0.05)) * (0.75 + this.rng() * 0.5);\n tok.gain = gain;\n }\n\n // Push node activations into the point shader attribute.\n for (let i = 0; i < this.act.length; i++) this.nodeAttr[i] = this.act[i]!;\n }\n\n /** The 784-vector for a class variant: real image if we have one,\n otherwise intensities derived from the blob shape. */\n private imageOf(cls: number, variant: number): Float32Array {\n const list = this.images[cls];\n if (list && list.length > 0) return list[Math.min(variant, list.length - 1)]!;\n const img = new Float32Array(784);\n const blob = this.blobs[cls]![Math.min(variant, this.blobs[cls]!.length - 1)]!;\n for (const c of blob) img[c.i] = Math.min(1, c.w + 0.25);\n return img;\n }\n\n private inject(fromBlob: boolean) {\n const slot = this.tokens.indexOf(null);\n if (slot < 0) return;\n const rng = this.rng;\n let src: number;\n if (fromBlob) {\n const variants = this.blobs[this.sampleClass]!;\n const blob = variants[Math.min(this.sampleVariant, variants.length - 1)]!;\n src = pickWeightedBlob(blob, rng());\n } else {\n src = Math.floor(rng() * LAYER_SIZES[0]);\n }\n const outs = this.net.out[src]!;\n // Sparse fan-out: some nodes happen to have no outgoing edge\n // (every input node is not reachable) — those tokens never spawn.\n if (outs.dst.length === 0) return;\n const pick = Math.floor(rng() * outs.dst.length);\n const len = edgeLen(this.net.positions, src, outs.dst[pick]!);\n this.tokens[slot] = {\n src,\n dst: outs.dst[pick]!,\n w: outs.w[pick]!,\n layer: 0,\n t: 0,\n rate: (1.35 / Math.max(len, 0.05)) * (0.75 + rng() * 0.5),\n gain: fromBlob ? 1.0 : 0.6,\n pos: [0, 0, 0],\n };\n // The emitting input node flashes — a sample draws its \"digit\" on\n // the 28x28 plane, idle trickle pins it barely.\n this.act[src] = Math.min(2, this.act[src]! + (fromBlob ? 0.9 : 0.12));\n }\n\n /** Write live token rows into the point buffers (dead rows stay 0). */\n writeTokenBuffers() {\n for (let i = 0; i < TOKEN_POOL; i++) {\n const tok = this.tokens[i];\n const o = i * 3;\n if (!tok) {\n this.tokenGain[i] = 0;\n this.tokenPos[o] = 0;\n this.tokenPos[o + 1] = 0;\n this.tokenPos[o + 2] = 0;\n continue;\n }\n this.tokenPos[o] = tok.pos[0];\n this.tokenPos[o + 1] = tok.pos[1];\n this.tokenPos[o + 2] = tok.pos[2];\n this.tokenGain[i] = tok.gain;\n }\n }\n}\n\n/** Procedural 5x7-glyph digits — fallback when no samples are given. */\nfunction glyphBlobs(): ClassBlobs[] {\n const rng = mulberry32(0xd1617);\n const all: ClassBlobs[] = [];\n for (let cls = 0; cls < CLASSES; cls++) {\n const field = new Float32Array(28 * 28);\n const glyph = DIGITS[cls]!;\n const dx = 4 + Math.floor(rng() * 3);\n const dy = Math.floor(rng() * 3) - 1;\n for (let gr = 0; gr < 7; gr++) {\n const row = glyph[gr]!;\n for (let gc = 0; gc < 5; gc++) {\n if (row[gc] !== '#') continue;\n for (let k = 0; k < 4; k++) {\n for (let l = 0; l < 4; l++) {\n const r = gr * 4 + l + dy;\n const c = gc * 4 + k + dx;\n if (r < 28 && c < 28) field[r * 28 + c] = 1;\n }\n }\n }\n }\n const blob: InputBlob = [];\n for (let i = 0; i < 784; i++) {\n if (field[i]! > 0) blob.push({ i, w: 1 });\n }\n for (let k = 0; k < 8; k++) blob.push({ i: Math.floor(rng() * 784), w: 0.15 });\n all.push([blob]);\n }\n return all;\n}\n\n/** Decode base64url into raw bytes — shared by weights and samples. */\nfunction decodeB64(b64: string): Uint8Array {\n const bin = atob(b64.replace(/-/g, '+').replace(/_/g, '/'));\n const buf = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);\n return buf;\n}\n\n/** Decode packed FP32 little-endian base64url into a Float32Array. */\nfunction decodeF32(b64: string): Float32Array {\n return new Float32Array(decodeB64(b64).buffer);\n}\n\n/** The trained sparse weight set (see train-sparse.py). */\nexport function decodeWeights(): { w: Float32Array[]; b: Float32Array[] } {\n return {\n w: [\n decodeF32(SPARSE_WEIGHTS.weights1),\n decodeF32(SPARSE_WEIGHTS.weights2),\n decodeF32(SPARSE_WEIGHTS.weights3),\n decodeF32(SPARSE_WEIGHTS.weights4),\n ],\n b: [\n decodeF32(SPARSE_WEIGHTS.biases1),\n decodeF32(SPARSE_WEIGHTS.biases2),\n decodeF32(SPARSE_WEIGHTS.biases3),\n decodeF32(SPARSE_WEIGHTS.biases4),\n ],\n };\n}\n\n/**\n * Splice trained weights into the visible net: every rendered edge\n * gets its trained value, the edge-alpha map follows |w|, and `out`\n * is rebuilt with the trained magnitudes for the hop visuals.\n */\nfunction attachWeights(net: Network, trained: { w: Float32Array[]; b: Float32Array[] }) {\n const layerStart = net.layerStart;\n for (let li = 1; li < 5; li++) {\n const base = layerStart[li]!;\n const w = trained.w[li - 1]!;\n let eo = 0;\n const nextBase = li < 4 ? layerStart[li + 1]! : net.nodeCount;\n for (let dlocal = 0; dlocal < nextBase - base; dlocal++) {\n const dst = base + dlocal;\n const list = net.inEdges[dst]!;\n for (const e of list) {\n e.w = w[eo]!;\n eo++;\n }\n }\n if (eo !== w.length) throw new Error(`layer ${li}: expected ${w.length} edges, got ${eo}`);\n }\n // rebuild out + edge alpha from trained weights\n for (const o of net.out) {\n o.dst.length = 0;\n o.w.length = 0;\n }\n let eo = 0;\n for (let d = 0; d < net.nodeCount; d++) {\n for (const e of net.inEdges[d]!) {\n net.out[e.src]!.dst.push(d);\n net.out[e.src]!.w.push(e.w);\n net.edgeWeights[eo * 2] = Math.min(1, Math.abs(e.w) * 1.7);\n net.edgeWeights[eo * 2 + 1] = Math.min(1, Math.abs(e.w) * 1.7);\n eo++;\n }\n }\n}\n\n/** Real forward pass through the visible, trained edges. */\nexport function forwardPass(\n net: Network,\n trained: { w: Float32Array[]; b: Float32Array[] },\n img: Float32Array,\n): { predicted: number; energy: Float32Array } {\n const act = new Float32Array(net.nodeCount);\n act.set(img);\n const layerStart = net.layerStart;\n // NOTE: layerStart has one entry per layer (no sentinel) — the size\n // must come from LAYER_SIZES, or the output layer gets size NaN and\n // every prediction collapses to a constant class.\n for (let li = 1; li < 5; li++) {\n const base = layerStart[li]!;\n const size = LAYER_SIZES[li]!;\n const bias = trained.b[li - 1]!;\n for (let dl = 0; dl < size; dl++) {\n let z = bias[dl]!;\n for (const e of net.inEdges[base + dl]!) z += act[e.src]! * e.w;\n act[base + dl] = li < 4 ? Math.max(z, 0) : z;\n }\n }\n // per-layer normalisation for the gating map\n const energy = new Float32Array(act.length);\n for (let li = 0; li < 5; li++) {\n const base = layerStart[li]!;\n const size = LAYER_SIZES[li]!;\n let max = 1e-4;\n for (let i = base; i < base + size; i++) max = Math.max(max, act[i]!);\n for (let i = base; i < base + size; i++) energy[i] = Math.max(act[i]!, 0) / max;\n }\n const outBase = layerStart[4]!;\n let predicted = 0;\n let top = -1e9;\n for (let c = 0; c < CLASSES; c++) {\n if (act[outBase + c]! > top) {\n top = act[outBase + c]!;\n predicted = c;\n }\n }\n return { predicted, energy };\n}\n\nexport function decodeAll(samples: Record<number, readonly string[]>): {\n blobs: InputBlob[][];\n images: Float32Array[][];\n} {\n const blobs: InputBlob[][] = [];\n const images: Float32Array[][] = [];\n for (let c = 0; c < CLASSES; c++) {\n const cellList: InputBlob[] = [];\n const imgList: Float32Array[] = [];\n for (const b64 of samples[c] ?? []) {\n // One binary decode per sample drives both representations:\n // the weighted emission blob and the 784-vector the forward\n // pass consumes.\n const buf = decodeB64(b64);\n const cells: InputBlob = [];\n const img = new Float32Array(784);\n for (let n = 0; n < 784; n++) {\n const byte = buf[n >> 1]!;\n const v = n & 1 ? byte & 15 : byte >> 4;\n if (v >= 5) cells.push({ i: n, w: (v - 4) / 11 });\n img[n] = v / 15;\n }\n cellList.push(cells);\n imgList.push(img);\n }\n blobs.push(cellList);\n images.push(imgList);\n }\n return { blobs, images };\n}\n\nfunction pickWeightedBlob(blob: InputBlob, r: number): number {\n let total = 0;\n for (const c of blob) total += c.w;\n let acc = r * total;\n for (const c of blob) {\n acc -= c.w;\n if (acc <= 0) return c.i;\n }\n return blob[blob.length - 1]!.i;\n}\n\nfunction edgeLen(p: Float32Array, a: number, b: number): number {\n const a3 = a * 3;\n const b3 = b * 3;\n const dx = p[b3]! - p[a3]!;\n const dy = p[b3 + 1]! - p[a3 + 1]!;\n const dz = p[b3 + 2]! - p[a3 + 2]!;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n// -------------------------------------------------------------- shader -----\n\nconst POINT_VERT = /* glsl */ `\nattribute float aAct; // node activation, or token gain for tokens\nuniform float uHeightPx, uFovTan, uDpr, uFocusDist, uBlurK;\nuniform float uBaseSize;\nvarying float vAct;\nvarying float vFade;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n float dist = max(-mv.z, 0.001);\n vAct = aAct;\n float a = max(aAct, 0.0);\n float worldSize = uBaseSize * (1.0 + clamp(a, 0.0, 2.0) * 0.9);\n // uHeightPx is the drawing-buffer height (already device px), so the\n // world-size term needs no uDpr; the pixel-space defocus offset does.\n float px = worldSize * (uHeightPx * 0.5) / (uFovTan * dist);\n float dz = dist - uFocusDist;\n px += (dz < 0.0 ? -dz * 0.55 : dz * 0.8) * uBlurK * uDpr;\n gl_PointSize = min(px, 90.0 * uDpr);\n vFade = clamp(1.0 - abs(dz) * 0.16, 0.25, 1.0);\n gl_Position = projectionMatrix * mv;\n}\n`;\n\nconst NODE_FRAG = /* glsl */ `\nuniform float uExposure;\nvarying float vAct;\nvarying float vFade;\nconst vec3 DEEP = vec3(${PALETTE.deep.join(',')});\nconst vec3 MID = vec3(${PALETTE.mid.join(',')});\nconst vec3 CREST = vec3(${PALETTE.crest.join(',')});\nconst vec3 SLATE = vec3(${PALETTE.slate.join(',')});\nconst vec3 WHITE = vec3(${PALETTE.white.join(',')});\nvoid main() {\n float d = length(gl_PointCoord - 0.5) * 2.0;\n float disc = smoothstep(1.0, 0.35, d);\n if (disc < 0.01) discard;\n float a = vAct;\n vec3 col;\n float glow;\n if (a >= 0.0) {\n col = mix(MID, CREST, clamp(a, 0.0, 1.0));\n // Overdriven nodes bloom toward the brand's crystal white-green.\n float bloom = smoothstep(1.05, 1.9, a);\n col = mix(col, WHITE, bloom);\n glow = 0.36 + 0.64 * clamp(a, 0.0, 1.0) + bloom * 0.9;\n } else {\n col = mix(DEEP, SLATE, clamp(-a, 0.0, 1.0));\n glow = 0.16 + 0.25 * clamp(-a, 0.0, 1.0);\n }\n gl_FragColor = vec4(col * uExposure, disc * 0.62 * glow * vFade);\n}\n`;\n\nconst TOKEN_FRAG = /* glsl */ `\nuniform float uExposure;\nvarying float vAct;\nvarying float vFade;\nconst vec3 CREST = vec3(${PALETTE.crest.join(',')});\nconst vec3 WHITE = vec3(${PALETTE.white.join(',')});\nvoid main() {\n float g = vAct;\n if (g < 0.004) discard;\n float d = length(gl_PointCoord - 0.5) * 2.0;\n float core = smoothstep(0.55, 0.05, d);\n float halo = smoothstep(1.0, 0.3, d) * 0.45;\n if (core + halo < 0.01) discard;\n // Amplified tokens run hot toward white-green.\n vec3 col = mix(CREST, WHITE, smoothstep(1.1, 2.1, g));\n float b = (0.35 + 0.65 * clamp(g, 0.0, 1.6)) * (core + halo);\n gl_FragColor = vec4(col * uExposure, b * 0.78 * vFade);\n}\n`;\n\nconst EDGE_VERT = /* glsl */ `\nattribute float aEdgeW;\nvarying float vW;\nvoid main() {\n vW = aEdgeW;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst EDGE_FRAG = /* glsl */ `\nvarying float vW;\nconst vec3 DEEP = vec3(${PALETTE.crest.join(',')});\nvoid main() {\n gl_FragColor = vec4(DEEP, 0.02 + 0.05 * vW);\n}\n`;\n\nconst FOG_VERT = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst FOG_FRAG = /* glsl */ `\nuniform float uTime;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash(i), hash(i + vec2(1, 0)), f.x),\n mix(hash(i + vec2(0, 1)), hash(i + vec2(1, 1)), f.x),\n f.y\n );\n}\n\nvoid main() {\n vec2 c = vUv - 0.5;\n float r = length(c) * 2.0;\n // Soft brand-green well behind the stack, vignetted to darkness.\n vec3 col = vec3(0.012, 0.05, 0.04) * max(1.0 - r, 0.0);\n col += vec3(0.01, 0.06, 0.045) * max(1.5 - r * 1.25, 0.0);\n // Slow drifting wisps crossing in front of the black.\n float w = noise(vec2(vUv.x * 3.0 - uTime * 0.02, vUv.y * 6.0 + uTime * 0.013));\n w = pow(w, 3.0) * 0.5;\n col += vec3(0.05, 0.11, 0.09) * w * (1.0 - smoothstep(0.6, 1.2, r));\n gl_FragColor = vec4(col, 1.0);\n}\n`;\n\n// ------------------------------------------------------------ component ----\n\nexport type NeuralFlowKnobs = {\n /** Lens zoom divisor of the base fov. @default 1 */\n zoom: number;\n /** Exposure multiplier. @default 1.45 */\n exposure: number;\n /** Focal plane view-distance. @default 8.0 */\n focus: number;\n /** Depth-of-field strength in px. @default 4 */\n blurK: number;\n /** Timeline scale — 0 pauses time, 0.1-0.5 slow motion. @default 1 */\n speed: number;\n /** Token emission rate multiplier. @default 1 */\n intensity: number;\n /** Camera drift amplitude multiplier. @default 1 */\n drift: number;\n /** Turntable spin around the stack's centre, rad/s. 0 parks it.\n @default 0.02 — a full turn in ~5 minutes */\n spin: number;\n};\n\nconst DEFAULT_KNOBS: NeuralFlowKnobs = {\n zoom: 1,\n exposure: 1.45,\n focus: 8.0,\n blurK: 4,\n speed: 1,\n intensity: 1,\n drift: 1,\n spin: 0.02,\n};\n\nconst BASE_FOV = 36;\n// Horizontal: side-on vantage, the stack reads left (input 28x28) to\n// right (softmax column). Vertical: the stack rises bottom to top.\nfunction camFor(orientation: NeuralFlowOrientation) {\n return orientation === 'vertical'\n ? {\n base: new THREE.Vector3(0.7, 3.5, 9.6),\n target: new THREE.Vector3(0, 2.45, 0),\n center: new THREE.Vector3(0, 2.7, 0),\n fogSize: [13, 15] as const,\n fogPos: new THREE.Vector3(1.5, 2.7, -6.5),\n fogRot: 0,\n }\n : {\n base: new THREE.Vector3(-0.9, 0.88, 6.1),\n target: new THREE.Vector3(2.35, -0.08, -0.2),\n center: new THREE.Vector3(2.7, 0, 0),\n fogSize: [14, 8] as const,\n fogPos: new THREE.Vector3(7.2, 0, 0),\n fogRot: -Math.PI / 2,\n };\n}\n\nfunction SceneContent({\n knobs: knobsRef,\n orientation,\n blobs,\n images,\n}: {\n knobs: RefObject<NeuralFlowKnobs>;\n orientation: NeuralFlowOrientation;\n blobs: ClassBlobs[];\n images: Float32Array[][];\n}) {\n const { invalidate } = useThree();\n const trained = useMemo(() => decodeWeights(), []);\n const sim = useMemo(\n () => new FlowSim(1337, orientation, blobs, images, trained),\n [orientation, blobs, images, trained],\n );\n const camCfg = useMemo(() => camFor(orientation), [orientation]);\n\n const fogPlane = useMemo(\n () => new THREE.PlaneGeometry(camCfg.fogSize[0], camCfg.fogSize[1]),\n [camCfg],\n );\n\n const geos = useMemo(() => {\n const net = sim.network;\n const nodes = new THREE.BufferGeometry();\n nodes.setAttribute('position', new THREE.BufferAttribute(net.positions, 3));\n const actAttr = new THREE.BufferAttribute(sim.nodeAttr, 1);\n actAttr.setUsage(THREE.DynamicDrawUsage);\n nodes.setAttribute('aAct', actAttr);\n\n const tokens = new THREE.BufferGeometry();\n const posAttr = new THREE.BufferAttribute(sim.tokenPos, 3);\n posAttr.setUsage(THREE.DynamicDrawUsage);\n tokens.setAttribute('position', posAttr);\n const gainAttr = new THREE.BufferAttribute(sim.tokenGain, 1);\n gainAttr.setUsage(THREE.DynamicDrawUsage);\n tokens.setAttribute('aAct', gainAttr);\n // Frustum culling must never hide the moving token cloud.\n const b = 6;\n nodes.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);\n tokens.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);\n\n const edges = new THREE.BufferGeometry();\n edges.setAttribute('position', new THREE.BufferAttribute(net.edgePositions, 3));\n edges.setAttribute('aEdgeW', new THREE.BufferAttribute(net.edgeWeights, 1));\n edges.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);\n return [nodes, tokens, edges];\n }, [sim, camCfg]);\n\n const nodeMat = useMemo(() => makePointMaterial(), []);\n const tokenMat = useMemo(() => makeTokenMaterial(), []);\n const edgeMat = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: EDGE_VERT,\n fragmentShader: EDGE_FRAG,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n uniforms: {},\n }),\n [],\n );\n const fogMat = useMemo(\n () =>\n new THREE.ShaderMaterial({\n vertexShader: FOG_VERT,\n fragmentShader: FOG_FRAG,\n depthWrite: false,\n blending: THREE.NoBlending,\n uniforms: { uTime: { value: 0 } },\n }),\n [],\n );\n\n useEffect(\n () => () => {\n for (const g of geos) g.dispose();\n fogPlane.dispose();\n nodeMat.dispose();\n tokenMat.dispose();\n edgeMat.dispose();\n fogMat.dispose();\n },\n [geos, fogPlane, nodeMat, tokenMat, edgeMat, fogMat],\n );\n\n const worldTimeRef = useRef(0);\n const lastElapsedRef = useRef(0);\n // Tracks WHICH sim got its warm-up burst — a rebuilt sim (orientation\n // flip) must warm again or the net starts dead for seconds.\n const warmedSimRef = useRef<FlowSim | null>(null);\n const spinRef = useRef<THREE.Group>(null);\n\n /* eslint-disable react-hooks/immutability -- R3F frame loop drives\n GL uniform state by design; nothing here is React state. */\n useFrame((state) => {\n const speed = reduced() ? 0 : knobsRef.current.speed;\n const dt = Math.min(state.clock.elapsedTime - lastElapsedRef.current, 0.25);\n lastElapsedRef.current = state.clock.elapsedTime;\n worldTimeRef.current += dt * Math.max(speed, 0);\n const t = reduced() ? 8 : worldTimeRef.current;\n\n // Warm streaks once per sim so the first painted frame already\n // shows a working net (and the reduced-motion still isn't empty).\n const justWarmed = warmedSimRef.current !== sim;\n if (justWarmed) {\n for (let i = 0; i < 120; i++) sim.step(1 / 30, 1);\n warmedSimRef.current = sim;\n } else if (!reduced()) {\n sim.step(dt * Math.max(speed, 0), knobsRef.current.intensity);\n }\n sim.writeTokenBuffers();\n\n for (const [geo, attr] of [\n [geos[0]!, 'aAct'],\n [geos[1]!, 'position'],\n [geos[1]!, 'aAct'],\n ] as const) {\n const a = geo.getAttribute(attr) as THREE.BufferAttribute;\n a.needsUpdate = true;\n }\n\n const cam = state.camera as THREE.PerspectiveCamera;\n // Clamp: zoom=0 would yield fov=Infinity and a NaN projection.\n const fov = BASE_FOV / Math.max(knobsRef.current.zoom, 0.05);\n if (Math.abs(cam.fov - fov) > 0.01) {\n cam.fov = fov;\n cam.updateProjectionMatrix();\n }\n const drift = knobsRef.current.drift;\n cam.position.set(\n camCfg.base.x + Math.sin(t * 0.11) * 0.16 * drift,\n camCfg.base.y + Math.sin(t * 0.073 + 2.0) * 0.09 * drift,\n camCfg.base.z + Math.cos(t * 0.091) * 0.16 * drift,\n );\n cam.lookAt(camCfg.target);\n\n const height = state.gl.domElement.height;\n const fovTan = Math.tan(THREE.MathUtils.degToRad(cam.fov * 0.5));\n for (const m of [nodeMat, tokenMat]) {\n m.uniforms.uHeightPx!.value = height;\n m.uniforms.uFovTan!.value = fovTan;\n m.uniforms.uDpr!.value = state.gl.getPixelRatio();\n m.uniforms.uFocusDist!.value = knobsRef.current.focus;\n m.uniforms.uBlurK!.value = knobsRef.current.blurK;\n m.uniforms.uExposure!.value = knobsRef.current.exposure;\n }\n if (spinRef.current) spinRef.current.rotation.y = t * knobsRef.current.spin;\n fogMat.uniforms.uTime!.value = t;\n // Under frameloop='demand' an unconditional invalidate keeps a\n // vsync-rate loop alive forever — reduced motion paints its still\n // on warm-up, then rendering truly stops.\n if (!reduced() || justWarmed) invalidate();\n });\n /* eslint-enable react-hooks/immutability */\n\n return (\n <group>\n <mesh\n geometry={fogPlane}\n material={fogMat}\n position={camCfg.fogPos.toArray()}\n rotation={[0, camCfg.fogRot, 0]}\n renderOrder={0}\n key={orientation}\n />\n {/* Turntable: rotate the whole net around the stack's centre\n without touching the camera or the fog backdrop. */}\n <group ref={spinRef} position={camCfg.center.toArray()}>\n <group position={camCfg.center.clone().negate().toArray()}>\n <lineSegments geometry={geos[2]} material={edgeMat} renderOrder={1} />\n <points geometry={geos[0]} material={nodeMat} renderOrder={2} />\n <points geometry={geos[1]} material={tokenMat} renderOrder={3} />\n </group>\n </group>\n </group>\n );\n}\n\nfunction makePointMaterial() {\n return new THREE.ShaderMaterial({\n vertexShader: POINT_VERT,\n fragmentShader: NODE_FRAG,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uHeightPx: { value: 600 },\n uFovTan: { value: 0.3 },\n uDpr: { value: 1 },\n uFocusDist: { value: 8.0 },\n uBlurK: { value: 4 },\n uBaseSize: { value: 0.025 },\n uExposure: { value: 1.45 },\n },\n });\n}\n\nfunction makeTokenMaterial() {\n return new THREE.ShaderMaterial({\n vertexShader: POINT_VERT,\n fragmentShader: TOKEN_FRAG,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n uniforms: {\n uHeightPx: { value: 600 },\n uFovTan: { value: 0.3 },\n uDpr: { value: 1 },\n uFocusDist: { value: 8.0 },\n uBlurK: { value: 4 },\n uBaseSize: { value: 0.011 },\n uExposure: { value: 1.35 },\n },\n });\n}\n\nfunction reduced(): boolean {\n return (\n typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\nexport interface NeuralFlowProps {\n /** Additional CSS classes for the container element */\n className?: string;\n style?: CSSProperties;\n /** Lay the net down left-to-right (default) or stand it upright,\n input at the bottom, prediction at the top. */\n orientation?: NeuralFlowOrientation;\n /** Packed input samples: class index → base64url 4-bit-nibble strings\n (see mnist-samples.ts). Omit to use the bundled real MNIST set;\n pass a record missing any class (or {}) to fall back to\n procedural 5x7 numerals. Keep a STABLE reference — decoding and\n all geometry rebuild on prop identity. */\n inputSamples?: Record<number, readonly string[]>;\n zoom?: number;\n exposure?: number;\n focus?: number;\n blurK?: number;\n speed?: number;\n intensity?: number;\n drift?: number;\n spin?: number;\n}\n\nexport const NeuralFlow: FC<NeuralFlowProps> = ({\n className,\n style,\n orientation = 'horizontal',\n inputSamples,\n zoom,\n exposure,\n focus,\n blurK,\n speed,\n intensity,\n drift,\n spin,\n}) => {\n // atob-less environments (SSR, exotic runtimes): neither the bundled\n // samples nor the trained weights can decode — render the static\n // backdrop below instead of crashing mid-tree.\n const noAtob = typeof atob === 'undefined';\n const { blobs, images } = useMemo(() => {\n const src = inputSamples === undefined ? MNIST_SAMPLES : inputSamples;\n if (noAtob || Object.keys(src).length === 0) {\n return { blobs: glyphBlobs(), images: [] as Float32Array[][] };\n }\n const decoded = decodeAll(src);\n return decoded.blobs.every((v) => v.length > 0)\n ? decoded\n : { blobs: glyphBlobs(), images: [] as Float32Array[][] };\n }, [inputSamples, noAtob]);\n const knobs = useRef<NeuralFlowKnobs>({ ...DEFAULT_KNOBS });\n useEffect(() => {\n knobs.current = {\n zoom: zoom ?? DEFAULT_KNOBS.zoom,\n exposure: exposure ?? DEFAULT_KNOBS.exposure,\n focus: focus ?? DEFAULT_KNOBS.focus,\n blurK: blurK ?? DEFAULT_KNOBS.blurK,\n speed: speed ?? DEFAULT_KNOBS.speed,\n intensity: intensity ?? DEFAULT_KNOBS.intensity,\n drift: drift ?? DEFAULT_KNOBS.drift,\n spin: spin ?? DEFAULT_KNOBS.spin,\n };\n }, [zoom, exposure, focus, blurK, speed, intensity, drift, spin]);\n\n if (noAtob) {\n return (\n <div\n aria-hidden=\"true\"\n className={className}\n style={{ ...style, position: 'absolute', inset: 0, background: BACKDROP }}\n />\n );\n }\n\n return (\n <div\n className={className}\n style={{\n ...style,\n position: 'absolute',\n inset: 0,\n background: BACKDROP,\n }}\n >\n <Canvas\n aria-hidden=\"true\"\n dpr={[1, 2]}\n frameloop={reduced() ? 'demand' : 'always'}\n camera={{ position: camFor(orientation).base.toArray(), fov: BASE_FOV }}\n gl={{\n // Opaque canvas — sidesteps compositing quirks around\n // premultiplied additive pixels (renders black-transparent on\n // some stacks, stalls readback on others). The backdrop tone\n // comes from the clear color + fog plane instead.\n alpha: false,\n antialias: true,\n powerPreference: 'high-performance',\n preserveDrawingBuffer: true,\n }}\n onCreated={({ gl }) => {\n gl.setClearColor(0x010806, 1);\n }}\n >\n <SceneContent knobs={knobs} orientation={orientation} blobs={blobs} images={images} />\n </Canvas>\n </div>\n );\n};\n","/* cspell:disable */\n/**\n * Real MNIST test-set samples: four canonical images per class\n * (closest to the class centroid, via sklearn fetch_openml). 784 greyscale pixels\n * quantized to 4-bit nibbles, packed two per byte, base64url-encoded.\n * ~392 bytes per sample — 40 samples in ~16 KB text.\n */\nexport const MNIST_SAMPLES: Record<number, string[]> = {\n 0: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4tgAAAAAAAAAAAAAAff_-gAAAAAAAAAAAACv____8IAAAAAAAAAAD7_2v__-gAAAAAAAAAC3_-wAv__UAAAAAAAAAr_-yAGz_9QAAAAAAAAf_9wAAAu_1AAAAAAAALv-hAAAAb_kQAAAAAALf-wAAAABf_RAAAAAAA__iAAAAAF_-IAAAAAAG_4AAAAAAf_8wAAAAAAr_cAAAAAPv_AAAAAAACv8AAAAACP_VAAAAAAAK_wAAAACP_1AAAAAAAAr_AAAAB__6AAAAAAAACv9gAAKf_9EAAAAAAAAK_7iL___-YAAAAAAAAAb______7IAAAAAAAAAAY7___6kAAAAAAAAAAAABI35gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzKIAAAAAAAAAAAAAAE3_-wAAAAAAAAAAAAAE3__2AAAAAAAAAAAAAC3____HEAAAAAAAAAAEv__t__-gAAAAAAAAAAj9z6FL__YAAAAAAAAADfgXYAF__kAAAAAAAAA-0QAAABf_0AAAAAAAA9-AAAAAA__gAAAAAAAF_zAAAAAAn-AAAAAAAAn5AAAAAAG_4AAAAAAADvcAAAAABP-AAAAAAAAO9wAAAAA-_AAAAAAAAA76AAAAAJ_3AAAAAAAADvwAAAAZ_6AAAAAAAAAO_RAAAb_6AAAAAAAAAA7_1Cd9_6AAAAAAAAAADP_____6AAAAAAAAAAAE7____WAAAAAAAAAAAABIr_tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHuAAAAAAAAAAAAAAAAU7_oAAAAAAAAAAAAAAG__9RAAAAAAAAAAAAAD7___ySAAAAAAAAAAAAn_____5SAAAAAAAAAAHP_XREXvsQAAAAAAAACf_zAAAE74AAAAAAAAAu__EAAAC_4QAAAAAAAG_9gQAAAL_0AAAAAAABz_cAAAAAv_gAAAAAAAn_kQAAAALf-AAAAAAAHP8wAAAACP_xAAAAAAB_-wAAAABP_6EAAAAAAL_7AAAAB9_8EAAAAAAAz_oAAAAf__UAAAAAAACf9AAABc__YQAAAAAAAJ_6AAWP_-UQAAAAAAAAb_52j__6IAAAAAAAAAAK____-UEAAAAAAAAAAAAjashAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1VaYAAAAAAAAAAAAAed___lAAAAAAAAAAADj____bYAAAAAAAAAAAz_-Xz7EAAAAAAAAAAAj_-RB__BAAAAAAAAAAP_-QAAj_gAAAAAAAAAG_-hAAAZ_jAAAAAAAAK__lAAAAXvgAAAAAAAC__2AAAAAF_gAAAAAAAO_4AAAAAAL-MAAAAAAG_9MAAAAAAv-QAAAAAAn_kAAAAAAC_5AAAAAACf8gAAAAAAj_kAAAAAAJ_yAAAAAAf_4QAAAAAAn_IAAAAAfP-QAAAAAACf-yAAASj_2BAAAAAAAF__-Hd8__sQAAAAAAAADf______wgAAAAAAAAAAXv___9kQAAAAAAAAAAAEr7VVMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 1: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeyAAAAAAAAAAAAAAAAB_oAAAAAAAAAAAAAAAAH-wAAAAAAAAAAAAAAAAf8EAAAAAAAAAAAAAAACP8QAAAAAAAAAAAAAAAd_RAAAAAAAAAAAAAAAF_7AAAAAAAAAAAAAAAAj_sAAAAAAAAAAAAAAACv9wAAAAAAAAAAAAAAAO_1AAAAAAAAAAAAAAAD__EAAAAAAAAAAAAAAAj_sAAAAAAAAAAAAAAACv9gAAAAAAAAAAAAAAAe_iAAAAAAAAAAAAAAAI_5AAAAAAAAAAAAAAAAv_YAAAAAAAAAAAAAAAC_4gAAAAAAAAAAAAAAAf9wAAAAAAAAAAAAAAAB7SAAAAAAAAAAAAAAAAC3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAAAAAAAAAAAAAAf9AAAAAAAAAAAAAAAALf0AAAAAAAAAAAAAAABPlTAAAAAAAAAAAAAAAG_lAAAAAAAAAAAAAAAD_9EAAAAAAAAAAAAAAAr_oAAAAAAAAAAAAAAADP9QAAAAAAAAAAAAAAAM_1AAAAAAAAAAAAAAAD79EAAAAAAAAAAAAAAAb_wAAAAAAAAAAAAAAAPv9gAAAAAAAAAAAAAABv_RAAAAAAAAAAAAAAAd_7AAAAAAAAAAAAAAAF_-YAAAAAAAAAAAAAAAb4gAAAAAAAAAAAAAAADfogAAAAAAAAAAAAAAA-tgAAAAAAAAAAAAAAADrBAAAAAAAAAAAAAAAANJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpAAAAAAAAAAAAAAAAAL9wAAAAAAAAAAAAAAAAv6AAAAAAAAAAAAAAAADPoAAAAAAAAAAAAAAABP-QAAAAAAAAAAAAAAAF_RAAAAAAAAAAAAAAAAv_MAAAAAAAAAAAAAAAC_wQAAAAAAAAAAAAAAAu-wAAAAAAAAAAAAAAAD_7AAAAAAAAAAAAAAAAP_UAAAAAAAAAAAAAAAA_wQAAAAAAAAAAAAAAAJ-QAAAAAAAAAAAAAAAF70AAAAAAAAAAAAAAAAr-IAAAAAAAAAAAAAAACvgAAAAAAAAAAAAAAAAK9AAAAAAAAAAAAAAAAArAAAAAAAAAAAAAAAAACWAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAAAC7QAAAAAAAAAAAAAAAAP-IAAAAAAAAAAAAAAACP9AAAAAAAAAAAAAAAAJ_QAAAAAAAAAAAAAAAAn9AAAAAAAAAAAAAAAADvoAAAAAAAAAAAAAAAAP8gAAAAAAAAAAAAAAAA_wAAAAAAAAAAAAAAAAr-AAAAAAAAAAAAAAAADfkAAAAAAAAAAAAAAAAN-QAAAAAAAAAAAAAAAB31AAAAAAAAAAAAAAAAT_MAAAAAAAAAAAAAAACPwAAAAAAAAAAAAAAAAK-wAAAAAAAAAAAAAAAAr2AAAAAAAAAAAAAAAAA-YAAAAAAAAAAAAAAAAAZwAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 2: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABu3cQAAAAAAAAAAAAABv__-IAAAAAAAAAAAAAX3af-xAAAAAAAAAAAACHEAj_oAAAAAAAAAAAABEAAc-wAAAAAAAAAAAAAAAAb7AAAAAAAAAAAAAAAABf4wAAAAAAAAAAAAAAAA30AAAAAAAAAAAAAAAAPtIAAAAAAAAAAAAAAABvsAAAAAAAAAAAAAAAAJ-wAAAAAAAAAAAAAAAG_7AAAAAAAAAAAAAAAAn_QAAAAAAAAAAABEAAXvgQAAAAAAAAAANu7Mz_8gAAAAAAAAAAHf_u___EEAAAAAAAAAB_933___-0IQAAAAAAAI_73_1t3u7ZAAAAAAAADP__kAACUwAAAAAAAAAF_-YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd-RAAAAAAAAAAAAAAff-_0gAAAAAAAAAAAAT__Bn8AAAAAAAAAAAAA_-hAM-AAAAAAAAAAAAAcwAAf3AAAAAAAAAAAAAAAABvoAAAAAAAAAAAAAAAAG-gAAAAAAAAAAAAAAAAb6AAAAAAAAAAAAAAAABvgAAAAAAAAAAAAAAAAG4gAAAAAAAAAAAAAAAC3AAAAAAAAAAAAAAAKb78AAAAAAAAAAARAnU___4gAAAAAAAAB-3P_9___4AAAAAAAAAHKfkiJcePUAAAAAAAAAicgQFN9G9wAAAAAAAACvoFnf9wTaAAAAAAAAAK-l_P_BACUAAAAAAAAAPP__-wAAAAAAAAAAAAAEz5lhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHAAAAAAAAAAAAAAAAb_9wAAAAAAAAAAAAAAB-X8AAAAAAAAAAAAAAAMgM4AAAAAAAAAAAAAAC5w2QAAAAAAAAAAAAAACBP5AAAAAAAAAAAAAAABB_kAAAAAAAAAAAAAAAAH9gAAAAAAAAAAAAAAAAviAAAAAAAAAAAAAAAAHdAAAAAAAAAAAAAAAABvgAAAAAAAAAAAAAAAAK9gAAAAAAAAAAAAACEB3RAAAAAAAAAAAAAH_Xf4AAAAAAAAAAAAAF_u__QAAAAAAAAAAAAC2gLP-RAAAAAAAAAAAAn2BO__21AAAAAAAAAAB_Mc9ie5QAAAAAAAAAAC_N-QAAAAAAAAAAAAAAB-9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACv9MAAAAAAAAAAAAAAD7__SAAAAAAAAAAAAAB7qN_0QAAAAAAAAAAAAj1AAn2AAAAAAAAAAAAAVAAAM0QAAAAAAAAAAAAAAAAbyAAAAAAAAAAAAAAAABPIAAAAAAAAAAAAAAAAH4gAAAAAAAAAAAAAAAArAAAAAAAAAAAAAAAAAP5AAAAAAAAAAAAAAAACtIAAAAAAAAAAAAAFHyvcAAAAAAAAAAAAEnf__-RAAAAAAAAAAAG__zP_foAAAAAAAAAAC38Mb-AeQAAAAAAAAAAv7EZ9wAAAAAAAAAAAADOIb-gAAAAAAAAAAAAAdo7-iAAAAAAAAAAAAAAz_-iAAAAAAAAAAAAAACOswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 3: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs8wAAAAAAAAAAAAAAF5_9cyAAAAAAAAAAAACf___7-gAAAAAAAAAAAH_93HjvkAAAAAAAAAAAbHEQAe-AAAAAAAAAAAAAAABO-yAAAAAAAAAAAAAACf_CAAAAAAAAAAAAE4q_9xAAAAAAAAAAAAB____SAAAAAAAAAAAAAH___4MAAAAAAAAAAAAAbNhb5QAAAAAAAAAAAAAAAAAosAAAAAAAAAAAAAAAAADWAAAAAAAAAAAAAAAAALkAAAAAAAAAAAAAAAAA6QAAAAAAAAAAAAAAAAr4AAAAAAAAFwAAAAAAH_MAAAAAAAAv54ZERK_ccAAAAAAAAAj______6EQAAAAAAAAAEaN_f-zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa___2BAAAAAAAAAAAACv____wQAAAAAAAAAAAG__7uv5AAAAAAAAAAAAFmUABvkAAAAAAAAAAAAAAAFO-QAAAAAAAAAAAAAAGf_4AAAAAAAAAAAAABOf_qEAAAAAAAAAAAA0v__1AAAAAAAAAAAAB_____kgAAAAAAAAAAAE7__O_NMAAAAAAAAAAABLthNBmQAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAA0QAAAAAAAAAAAAAAAADUAAAAAAAAAAAAAAAABeYAAAAAAAAAAAAAAAKP0QAAAAAAAAAXlmZmzv-QAAAAAAAAAI_______2AAAAAAAAAAX_____1RAAAAAAAAAAAYubpgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPvpolhAAAAAAAAAAAE7P____1AAAAAAAAAAAK3jpV-_1AAAAAAAAAAABQAAAH_0AAAAAAAAAAAAAAASv9QAAAAAAAAAAAAAAXv_UAAAAAAAAAAAAAGj_-xAAAAAAAAAAAAAF__5AAAAAAAAAAAAAAATv_DAAAAAAAAAAAAAAAG__5QAAAAAAAAAAAAAABf_7EAAAAAAAAAAAAAAAO_-hAAAAAAAAAAAAAAAD7_QAAAAAAAAAAAAAAACv9AAAAAAAAAAAAAAAAb_0AAAAAAAAAAAAAAG8_8EAAAAAAAAAAAADjP__YAAAAAAAAAAAKq7__-UAAAAAAAAAAABv_9wzMAAAAAAAAAAAAI_3EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYjugxAAAAAAAAAAAALP____wAAAAAAAAAAAA__Jn__0AAAAAAAAAAACcQABv-IAAAAAAAAAAAAAAAX_wAAAAAAAAAAAAAAAf_9QAAAAAAAAAAAAAAj_-QAAAAAAAAAAAAAj3_9gAAAAAAAAAAAABO__-1EAAAAAAAAAAAAK_____cUAAAAAAAAAAAPf___v_0AAAAAAAAAAAARVVDXvoAAAAAAAAAAAAAAAAv-gAAAAAAAAAAAAAAA9_zAAAAAAAAAAAAAAA9_3EAAAAAAAAAAAAAKO_5AAAAAAAAAAAABnfP_mAAAAAAAAAAAABP__-yAAAAAAAAAAAAAe__6AAAAAAAAAAAAAAAj8QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 4: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4QAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAADPcAAAAAAAAAAAAAAAAd8wAAAAAAAAAAAnMAAG_iAAAAAAAAAAAa9gAAj6AAAAAAAAAAAa_jAADPcAAAAAAAAAAa_3AABv9AAAAAAAAAAG_3AAAI_BAAAAAAAAAB78AAAB74cwAAAAAAAACv-3VXz__7AAAAAAAAABn______ZMAAAAAAAAAAEmcq_-hAAAAAAAAAAAAAAAG_0AAAAAAAAAAAAAAABz6AAAAAAAAAAAAAAAAX_UAAAAAAAAAAAAAAAHPoAAAAAAAAAAAAAAABP9AAAAAAAAAAAAAAAAJ-gAAAAAAAAAAAAAAAAbSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAG-QAAAAAAAAAAAAAAAAb5AAAAAAAAAAALIAAACPYAAAAAAAAAAC5wAAAJ8wAAAAAAAAAABRAAAAqwAAAAAAAAAAJAAAAAFhAAAAAAAAAACVAAAABvgAAAAAAAAABPcAAABL9SAAAAAAAAANUAAAAq_8kAAAAAAAA6sRdXjO__-QAAAAAAAJ_93_7___tjAAAAAAAAK93dyHdMkQAAAAAAAAAAAAAAAW5QAAAAAAAAAAAAAAAHfhAAAAAAAAAAAAAAACnWAAAAAAAAAAAAAAAAiJAAAAAAAAAAAAAAAAOpYAAAAAAAAAAAAAAAAEoAAAAAAAAAAAAAAAAEswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtgAAAAAAAAAAAAAAAAHmAAAAAAAAAAABcAAABPYAAAAAAAAAAAfiAAAJ8gAAAAAAAAAACbAAAA7AAAAAAAAAAABPQAAAP3AAAAAAAAAAAJ0QAACPYAAAAAAAAAAE-AAAAL4QAAAAAAAAABz2IAAD-QAAAAAAAAAAb__tynv2AAAAAAAAAABv7-____YAAAAAAAAAABISEiJe4QAAAAAAAAAAAAAAAD9wAAAAAAAAAAAAAAAAb3AAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAL9wAAAAAAAAAAAAAAAA3yAAAAAAAAAAAAAAAADdEAAAAAAAAAAAAAAAAuwAAAAAAAAAAAAAAAAB5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtEAAAAAAAAAAAAAAAAG4gAAAAAAAAAAABoQAAbzAAAAAAAAAAAAX2AABvMAAAAAAAAAAACvYAAG0QAAAAAAAAAAAvwQAAbRAAAAAAAAAAAK-AAACsAAAAAAAAAAAB2hAAAMwAAAAAAAAAAAf2AAAE_AAAAAAAAAAACfgAAAn3AAAAAAAAAAAJ__-p7_IAAAAAAAAAAAf_____oAAAAAAAAAAAAFrbiv5QAAAAAAAAAAAAABAD-gAAAAAAAAAAAAAAAA32AAAAAAAAAAAAAAAAD_EAAAAAAAAAAAAAAAB_kAAAAAAAAAAAAAAAAd9wAAAAAAAAAAAAAAAD-wAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 5: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsgAAAAAAAAAAAAAAAF-oQAAAAAAAAB5IAAkjtYAAAAAAAAAAC38zP-1AAAAAAAAAAAACcqqUgAAAAAAAAAAAAAtcAAAAAAAAAAAAAAAAH9AAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAAX-3VAAAAAAAAAAAAAABf_L-AAAAAAAAAAAAAADtQCfUAAAAAAAAAAAAAAAAB6QAAAAAAAAAAAAAAAACeEAAAAAAAAAAAAAAAAE9wAAAAAAAAAAAAAAAAT3AAAAAAAAAAAAAAAAB_QAAAAAAAAAAFAAAABewQAAAAAAAAAAexAAGv4gAAAAAAAAAAAa65v_kgAAAAAAAAAAAAF8_KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALYAAAAAAAAAAAAAAABc5AAAAAAAAAAAAAAAKu0gAAAAAAAAAAAAABfvoQAAAAAAAAAAAAAFz8MAAAAAAAAAAAAAAr_nAAAAAAAAAAAAAAAr6yAAAAAAAAAAAAAAAG9gAAAAAAAAAAAAAAAAL_2WEAAAAAAAAAAAAAADjf_rUAAAAAAAAAAAAAAAA535AAAAAAAAAAAAAAAAAK9AAAAAAAAAAAAAAAAAHmAAAAAAAAAAAAAAAAANoAAAAAAAAAAAAAAAAB5gAAAAAAAAAAAAAAABr0AAAAAAAAAAAAAAABz3AAAAAAAAAAAAAAADz3AAAAAAAAAAAAAAJa7UAAAAAAAAAAAAAACfthAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfxAAAAAAAAAAAAAAAAC_wQAAAAAAAAAAAAAAB-38EAAAAAAAAAAAAABewHoQAAAAAAAAAAAAAc4wAAAAAAAAAAAAAAAJ-AAAAAAAAAAAAAAAAA3zAAAAAAAAAAAAAAAAT6EgAAAAAAAAAAAAAABP_e1gAAAAAAAAAAAAAAXNzfgAAAAAAAAAAAAAAAEB_2AAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAC-QAAAAAAAAAAAAAAAAL3AAAAAAAAAAAAAAAACfcAAAAAAAAAAAAAAAAP5AAAAAAAAAAAAAAAAG9gAAAAAAAAAAAAAAAG7SAAAAAAAAAAAAAAAp6QAAAAAAAAAAAAAAAItQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsEAAAAAAAAAAAAAAAAG8gAAAAAAAAAAAAAAAAmgB2AAAAAAAAAAAAAALYWfkAAAAAAAAAAAAAK__9kQAAAAAAAAAAAAB_6WEAAAAAAAAAAAAAAc0gAAAAAAAAAAAAAAAJ9AAAAAAAAAAAAAAAAq9gAAAAAAAAAAAAAABu_6mWMAAAAAAAAAAAAJ6e7u_5IAAAAAAAAAAAAAAAA4-QAAAAAAAAAAAAAAAAB_QAAAAAAAAAAAAAAAAJ9AAAAAAAAAAAAAAAAI-QAAAAAAAAAAAAAAAI-xAAAAAAAAAAAANQBt-QAAAAAAAAAAAAfiS_swAAAAAAAAAAAAX-z9YAAAAAAAAAAAAABf6nEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 6: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAAAE_1AAAAAAAAAAAAAAABn-EAAAAAAAAAAAAAAAL_kAAAAAAAAAAAAAAAGv0wAAAAAAAAAAAAAACP9AAAAAAAAAAAAAAAAM-AAAAAAAAAAAAAAAAI_iAAAAAAAAAAAAAAAB73AAAAAAAAAAAAAAAAj8AAAgAAAAAAAAAAAAT_UABNxwAAAAAAAAAACPkABM_-UAAAAAAAAAAM8QXv___AAAAAAAAAAAzxn_7HT9IAAAAAAAAALpD_wQAvwAAAAAAAAABv9_0AAc_AAAAAAAAAAG___mR9_WAAAAAAAAAAPv_____EAAAAAAAAAAAE7____xAAAAAAAAAAAAAYjNhRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-kAAAAAAAAAAAAAAAAL9AAAAAAAAAAAAAAAAa-QAAAAAAAAAAAAAAAI_iAAAAAAAAAAAAAAAC72AAAAAAAAAAAAAAAAX_AAAAAAAAAAAAAAAACfsAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAI_QAAAAAAAAAAAAAAAD7zAAAAAAAAAAAAAAAAf9EAAAAAAAAAAAAAAACvoAAXyDAAAAAAAAAABO4wCO__9wAAAAAAAAAH-QGv_Lz_EAAAAAAAAAf3Pf-RBP0QAAAAAAAAA_3v1AAE-AAAAAAAAAAB7_9gIlzgAAAAAAAAAACP__vv_3AAAAAAAAAAAAr____nAAAAAAAAAAAAAp__-1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8cAAAAAAAAAAAAAAAAbwAAAAAAAAAAAAAAAAb9QAAAAAAAAAAAAAAAJ-AAAAAAAAAAAAAAAAF-yAAAAAAAAAAAAAAAF7TAAAAAAAAAAAAAAAD7kAAAAAAAAAAAAAAABv3AAAAAAAAAAAAAAAAj6AAAAAAAAAAAAAAAATdIAAAAAAAAAAAAAAAG_QAAFdzAAAAAAAAAABvgABc__9AAAAAAAAAAb8gGf_nPJAAAAAAAAAF9wK-cxALkAAAAAAAAAf2CuUAAD5wAAAAAAAABPZfUAAAnBAAAAAAAAAB6IsQAAbkAAAAAAAAAACv5wAAXnAAAAAAAAAAADz9mq33AAAAAAAAAAAAAY7_xzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7QAAAAAAAAAAAAAAABziAAAAAAAAAAAAAAAAj2AAAAAAAAAAAAAAAAPrAAAAAAAAAAAAAAAACOMAAAAAAAAAAAAAAAA_kAAAAAAAAAAAAAAAAL9AAAAAAAAAAAAAAAAD-AAAAAAAAAAAAAAAAArSAAAAAAAAAAAAAAAAX4AAAAAAAAAAAAAAAADOAAAAAAAAAAAAAAAAAekAABIgAAAAAAAAAAAF9AAK3_sQAAAAAAAAAAzzA866n0AAAAAAAAAADuA-9wAOkAAAAAAAAAAO4J-AAA7QAAAAAAAAAAz0mQAAn0AAAAAAAAAABfmLIDv4AAAAAAAAAAAAz9_t7mAAAAAAAAAAAAAp__mSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 7: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnef-QAAAAAAAAAABq_____-MAAAAAAAAAAN____6v9gAAAAAAAAAAr_-pMW_9AAAAAAAAAAAUkwAAr_oAAAAAAAAAAAAAAAHP5AAAAAAAAAAAAAAAA__QAAAAAAAAAAAAAAAF_7AAAAAAAAAAAAAAABz_UAAAAAAAAAAAAAAAX_sQAAAAAAAAAAAAAAHP9QAAAAAAAAAAAAAACf-xAAAAAAAAAAAAAAA-_RAAAAAAAAAAAAAAAE_8AAAAAAAAAAAAAAAAT_cAAAAAAAAAAAAAAACf9AAAAAAAAAAAAAAAAM9wAAAAAAAAAAAAAAAD70AAAAAAAAAAAAAAAAX_sAAAAAAAAAAAAAAAAI9AAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASHERif_EAAAAAAAAAAB_______cAAAAAAAAAAF____7P9wAAAAAAAAAAA5lDMh33AAAAAAAAAAAAAAAADPEAAAAAAAAAAAAAAABf8AAAAAAAAAAAAAAAAL-wAAAAAAAAAAAAAAAC74AAAAAAAAAAAAAAAAX_MAAAAAAAAAAAAAAAHPoAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAI_BAAAAAAAAAAAAAAAC32AAAAAAAAAAAAAAAAn9EAAAAAAAAAAAAAAADvwAAAAAAAAAAAAAAAAe4gAAAAAAAAAAAAAAAF-QAAAAAAAAAAAAAAAAr3AAAAAAAAAAAAAAAALfcAAAAAAAAAAAAAAABPwQAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOJn_EAAAAAAAAAAFfM7___9AAAAAAAAABpv__WZN-AAAAAAAAAAI__oxAE3iAAAAAAAAAALFAAAAX9EAAAAAAAAAAAAAAACvcAAAAAAAAAAAAAAABPsgAAAAAAAAAAAAAAAI-wAAAAAAAAAAAAAAABj6AAAAAAAAAAAAAAAAX6EAAAAAAAAAAAAAAAC_oAAAAAAAAAAAAAAAAO9QAAAAAAAAAAAAAAAK9wAAAAAAAAAAAAAAAB30AAAAAAAAAAAAAAAATqEAAAAAAAAAAAAAAACvQAAAAAAAAAAAAAAAAv0gAAAAAAAAAAAAAAAC-AAAAAAAAAAAAAAAAAj7AAAAAAAAAAAAAAAABtIAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEn7mdpAAAAAAAAAAAAF_____9MAAAAAAAAAAF3_____9QAAAAAAAAAAnu__3Mz5AAAAAAAAAAACJEQQAvsAAAAAAAAAAAAAAAAL-AAAAAAAAAAAAAAAAE_iAAAAAAAAAAAAAAAAr4AAAAAAAAAAAAAAAAr_QAAAAAAAAAAAAAAAX_gAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAW-wAAAAAAAAAAAAAAAL_gAAAAAAAAAAAAAAAJ_2AAAAAAAAAAAAAAAB76AAAAAAAAAAAAAAAAn-QAAAAAAAAAAAAAAAXvkAAAAAAAAAAAAAAADP4gAAAAAAAAAAAAAAAf9gAAAAAAAAAAAAAAAA3RAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 8: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP_9MAAAAAAAAAAAAAXv___BAAAAAAAAAAAAn__6rvMAAAAAAAAAAAf_tQAI9wAAAAAAAAAATvsQAAv3AAAAAAAAAADf9AAALvMAAAAAAAAAAG_2AALvsQAAAAAAAAAAC_sgTv4wAAAAAAAAAAAF_9bv5AAAAAAAAAAAAAB-__9AAAAAAAAAAAAAAB3_-wAAAAAAAAAAAAACv__9EAAAAAAAAAAAAAv-uO-QAAAAAAAAAAAAj_YAX-IAAAAAAAAAAADfYAAK8wAAAAAAAAAAANsAABz3AAAAAAAAAAAA34EF3_MAAAAAAAAAAACP____oQAAAAAAAAAAAAr__-MAAAAAAAAAAAAAAHz4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGv_qxAAAAAAAAAAAAAK____swcgAAAAAAAAAE_8iI78eAAAAAAAAAAC34AAAc_0AAAAAAAAAAP_YAACv5AAAAAAAAAAAv9gABv8EAAAAAAAAAAAf6EBz9QAAAAAAAAAAAAe9gr8UAAAAAAAAAAAAAr-j_QAAAAAAAAAAAAAAL__UAAAAAAAAAAAAAAAn_8wAAAAAAAAAAAAAAf-73AAAAAAAAAAAAABr_Zv8gAAAAAAAAAAAAP_oR33AAAAAAAAAAAABv4wCvcAAAAAAAAAAAAJ9AAI_AAAAAAAAAAAAAn0AAb4AAAAAAAAAAAACP9Cj_cAAAAAAAAAAAAC7___0wAAAAAAAAAAAAAo_-kwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI6_9MAAAAAAAAAAAAYz___-zAAAAAAAAAAAI_-pb_99QAAAAAAAAAC75EAf8HXAAAAAAAAAAj-EACvdfYAAAAAAAAACPsAANwaoAAAAAAAAAAG_5IAla8wAAAAAAAAAACv_VA7_RAAAAAAAAAAACnv2L-RAAAAAAAAAAAAAC3_9wAAAAAAAAAAAAAATf_wAAAAAAAAAAAAAAf_z_AAAAAAAAAAAAAAf-M_9wAAAAAAAAAAAAC-MD_3AAAAAAAAAAAAB-QALfcAAAAAAAAAAAAOwAA_9AAAAAAAAAAAAE-QAt_wAAAAAAAAAAAAf-id_5AAAAAAAAAAAAAd___5AAAAAAAAAAAAAAWN_nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACt9AAAAAAAAAAAAmu1vf_4AAAAAAAAAAAt_u_6dTYAAAAAAAAAAF-iXkAASAAAAAAAAAAArkAKAAPoAAAAAAAAAACaAAEAbfgAAAAAAAAAAE8QAAr_-AAAAAAAAAAACVAAf_5WAAAAAAAAAAAAiUj_wQMAAAAAAAAAAAAK7_wQAAAAAAAAAAAAAATP9QAAAAAAAAAAAAAAB_7YAAAAAAAAAAAAAAA95I4QAAAAAAAAAAAAAK-gb2AAAAAAAAAAAAADzABPkAAAAAAAAAAAAAT5AI9wAAAAAAAAAAAABPcE_lAAAAAAAAAAAAAE-QipAAAAAAAAAAAAAAL8OlIAAAAAAAAAAAAAAE78MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n 9: [\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ74UgAAAAAAAAAAAASv___2AAAAAAAAAAAATulmd-kAAAAAAAAAAAHsIAAAewAAAAAAAAAABsEAAABbYQAAAAAAAAAHQAAAAJ_yAAAAAAAAAB5AAAAAz9EAAAAAAAAAHdQAAVv_UAAAAAAAAAAG_-ruzfYAAAAAAAAAAABHy3MH9QAAAAAAAAAAAAAAAAuQAAAAAAAAAAAAAAAAPxAAAAAAAAAAAAAAAACtAAAAAAAAAAAAAAAAAdQAAAAAAAAAAAAAAAAK4gAAAAAAAAAAAAAAAB1gAAAAAAAAAAAAAAAAXiAAAAAAAAAAAAAAAADIAAAAAAAAAAAAAAAAAuMAAAAAAAAAAAAAAAAJsQAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAny0AAAAAAAAAAAAAAGP_d-QAAAAAAAAAAAALfkwG_QAAAAAAAAAAALPcAAH-wAAAAAAAAAAGvYAAAv8AAAAAAAAAABvgAAALvYAAAAAAAAAAcsAAAG_0QAAAAAAAAAD-QAALP9gAAAAAAAAAAL7AATv_hAAAAAAAAAAAJ-5z9f4AAAAAAAAAAAAO-62CvIAAAAAAAAAAAAAEgA-oAAAAAAAAAAAAAAAAI9AAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAAH7AAAAAAAAAAAAAAAABvUAAAAAAAAAAAAAAAAM0AAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAP3FwAAAAAAAAAAAAAAA_noAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO_pMAAAAAAAAAAAAAC____5ABIAAAAAAAAAB_tCJ9-QYwAAAAAAAABP4QAAL7BjAAAAAAAAAs4wAAC_sGMAAAAAAAAJ9wAABf9QUgAAAAAAAC7iAABO_QBQAAAAAAAAP_qZnf_4AAAAAAAAAAA-____7-EAAAAAAAAAAASIiGM_wAAAAAAAAAAAAAAAAI9wAAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAAAT9AAAAAAAAAAAAAAAACvYAAAAAAAAAAAAAAAAM8QAAAAAAAAAAAAAAAD_AAAAAAAAAAAAAAAAAr3AAAAAAAAAAAAAAAAHvIAAAAAAAAAAAAAAABf0AAAAAAAAAAAAAAAAD-AAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzz_xAAAAAAAAAAAAAHP_u_9QAAAAAAAAAAAHP0wA2_jAAAAAAAAAAB_1AAAb_QAAAAAAAAAAK-AAAHf4QAAAAAAAAAAriAACf4wAAAAAAAAAACuMABN-QAAAAAAAAAAAK_IjP_SAAAAAAAAAAAATv___4AAAAAAAAAAAAADbIbfcAAAAAAAAAAAAAAAA-wAAAAAAAAAAAAAAAAJ9gAAAAAAAAAAAAAAAA72AAAAAAAAAAAAAAAAL_IAAAAAAAAAAAAAAABvkAAAAAAAAAAAAAAAAd8wAAAAAAAAAAAAAAAG_RAAAAAAAAAAAAAAAAj0AAAAAAAAAAAAAAAAPvAAAAAAAAAAAAAAAAAaoAAAAAAAAAAAAAAAAAAAAAAAAAAAA=',\n ],\n};\n","/* cspell:disable */\n/**\n * Trained sparse weights for NeuralFlow — MNIST MLP constrained to\n * exactly the rendered 4294-edge topology (train-sparse.py in this\n * directory). FP32 little-endian, base64url; edge order is dst-major,\n * identical to the component's inEdges construction (seed 1337).\n */\nexport const SPARSE_WEIGHTS = {\n weights1:\n 'TQClvUogOIHCAKG_UKnRvng1HL8HxGO-Ld02P9eMJr8noC2_PhN0vxBR87yTra8-bI4jv3CFvwAnfvq-K9BdvWF3AAGq2gK8j6FFP1uQ8Dznlyg_lHEXPwhi9z5moF8-vxf6PjbLrbwcMDo-Gi7WvgJuOADm5Ni-fOuLvzj9nD6UJ-48Zvl_PYodsD7697u8gwYyvg0oLgFX7Yw_6AOSP0tz2z0H1a--RKWTv9rrJb9R08i8RM6EPqwOf7-Osh-8Rc5VPzwSTD-dPgY-4SxcPw7FujweAuG_qjNav_xOrTtx2_8-tDkjP9uLd75dX6G7-4tXPfGnDT-z9g6--NsVvuwyZz73R7K_PqjfPpWlQr_UJjW_EUETvz9b0b6xRtw9GFwEgRb0ZD6TAiU_FxN_vdk9QrvPswQ_XrgjPgKyAwBaTAg9U9gIABJnyzqphsU-pGbMPoMq5z6LlXY_GybiPcWCJD8iEpG_zOKrPVFsyztWWgw_UaLuvyOMR74L_zK-HQMfPgwON7-l8a89nYOWP5kddj6MEIY9s2oDAaagLj5oLJ-_GxbQPUJfJj-j2q6-0ciSPhv9ArlBoHq-Zleev1lJtD2SKMk8g5PlgARdJD_DR6G-h8vQPhfXKr7A-hS_VwKiPebfHD_Bw-C-doZ7v4D9Iz4WAQS__CopPnA2Hz-XlWW_kRInP8juFj5UFie_gZ0wPBZczz3HDxM6F3MjP28onb8hadi2LYABv-yaK76_sI2_GiIPPvYd3L7Vauq-1WMvgNT3NL_9aQo_pOaZgHPwFj10IGA_XNZgP_cbMT_Pv5u-M58Cv910Fb-acs69n_kkveYuLz60sUAAr_xAPOpZQoAATDo-ayKBOaadOD_Mn0e_CxNIv-m7Yj2S2A2-wTw1P_TQjL-ldpM-4QyCv8iG8r7_tWy-dasrP1Fagj_L9kc-ElqrvjyUpj1rnvO-11aLOYIaYru4oDaBYK0Dv3CPlr8AUgo6gNDhs2Za5T6ZqdK9NqZxP0otlz1hVYO_8rtJP0zPuT6kg_6_z8FWvlutrz335wo-L3Snvmog_L4Hq6A-k3LDPtE_K73jlx-_79D7vmYnagCbLEM_RIFMvPhwmD1P5qO-vvWIOobl0r3_Oem2ERIjPwUIjr-FXtA-6r2zPncPtT9n1LA9mt38PbnRzr3qyN898XvZPbL17726LCY-hWa5PwMBsD6xzZI8-0nHPjTrLD6GrLO-LbS9vX59w76EJWu-J93_vqHNwz6lieg_ncvAPdOmg77EhIo-r_yJvg6q277IU4c-i69Wv8JOAb7leqKAjolTP5YoooBJOeSAUOQ7gARger507oY-nW5LvrOdMzh7hkg_VBanP3w_2L4DqBY_kL8iP15nbLLRWxa9p-aCAH-vlr7oore3asQTv_AT1T3cbey-9GnCPHxkiT--x6AArvcnPk_ydb_TEkI_ziZfPzqYaD7Sx9C-ex34PWLYGb9BHks9XD5fPZNniYA8Iiu-2joHP5pHtr72j5k_L19WvWCIar5LE-CAgmedPS0z4r0NAJO9QKocP1ZXML7r_yK_yhypPkFTmby_8ja_wCAPATrr175F-Oy-iXoHP2tmBr5effI-anNEPxDzK71q9PW8hLgVPdL6IoE_JVK-3cRbP7YcFz9cOCA-rsEDP0HITb_3NaK_bMWPvlu70j6Lv-69TuBEvgkzZb_wDfwAwIJIP69TBj-l784q49OHP2AhhL6OFTK-w-gEACKaib-Idg89od8EPy1Le79CiG2_TgKpPo_eM7_yZHm8oRR4PmROOz5l_BUAaqM2v-Ps3z3oeu282xkkPkRDAL8KNyk9Qllqvu79zL8W4FE_eEdmPW-5HL384oE-ScZeP-py-D0Hcpy7H02UPYYIeb9Ngoi_5HkIPzL_NjzlPjU_Rsl5vyCx5j1jUjU9VB9IPoeWkb6RDq4-8wHiviKWEz9HrVa-ex6NP-wDiwF3g1w_OA9RACODab7fxS2_JfdIPyj0KT2q6bw-VII5vmahpj7SE8E-8h1lP79vhT8DZYS-trt9gIEpCD40CSm_orwYAZBNBrF8WwuACuC2Pz_Es77sGwC_HJi-vkiKfT4W_-k4EfOUvzjPCj0HIw-__t7APumcGj-gXNg-6uMRPwJ6Mb5uxyC-a-gdv2zdXz4X0gQ_iafnPtsVwr6MrxQ9_slQvZzb2712toG-H2rhvjTXB70Xgia_zIwIPkd4eb_re4e9KU4fP52cSoDt7oGzEVkSPgdj3Dxn08s-k0K_PlIEUDirrICAhjoNPxTMLz6yXTC7rzyPv6-H6b4kPQw7xE_eOQIdID-K16eABfWBPkC1jL253I09dQXQPsntsT4hHRo-xFKYPnX8or0OFuc6hH5Zv6PVBD0xTNi9JzYzP9coi70ylB090PUAvomQlzyhSjQ_qTTOv6o9Wz6djK0-WsftvUxPNbzWCgq_kZ6oPoqRmL-SuBw_FHlxP9KqSACg0uO_5MAYPy4nuj2LYh4_zC6Ovqh6Fr9d1gzA4rIfP7P5lz6AqCk-IaqPvw3nKQDTu-Q-dGoPP-S8Ar_SyTm_B1S9vAtONT47xeM-NIHLvr7nND-XHVe_R8ufP6AJDD5Z4Pq-5PCPvnMphj7BMBO_HCJnv9F1xT7P1u09AxV_P2D_HIEnuv2-vdPVvJkePoA9Xoe_NT_6vRWRhwD_j8U-tHRIAJ_urD6q5Aq_3VTuPgo3JL60tRGBgPIEgdjpTTqUWDaA-GuhAHPHEjjxcmwAzQSsAEkbGABHi7uwvp7EPRuQJD4AQZU-9B1VMQSQYb_0wm4_k-GLPDzpf763Qhw_YmSVvyIbyzz0fQs__uFYv2avnoBq2Z4-u7_avghoc74ROZa9mExugDjf8QB3Iha_2Bv9vPfwW4DtbVo_oTkvv2Gkhrq0D22-nvujPkphkj0WVes-82g4vorblrx1c_c_1YgNAH65Nb8lQDw93wNNv9ZaK7_CDS2_G61AP0WabL6O-k2_xrz7vsOCXzwZQ4s-J_1IP_xO0z_oYwS_786wvlnEjz4i06w_RXCePyZoBr2fIwQ_ODoYgWqlTz6pXgE_leP4PofYrr8Tc-mA4_f4vkOJOz_FDPi-YjEsAJjRc4BoXgAB3qo0AOCDfIAL5hcAG-F1gBuGhyARNn4AG7OaP98ZMD9M0OY_wOLMP9DEfr5iiGE9OdvtPjT1Oj_p_gw--9v9vaxPZr18k7S_lnadP_XDvD_efsO96sU3gBh64b66ZjS3212dP0YmJr6QbaG-iccxPzozKT8RM7Y-4D7_PSvsMT8xtx2-28dXgGaeib_XGMy7P0RQPttnnb213qQ_beQ4PyPZSj4P2w6ABibeO_2HdzzNFYkuUobsrYX9MrQVpCmmFQYtgFmK07khIjABfcSrOyBucj_H1x0_7so2P6oGcb4xz3i_FGdGgIL_7D29avS9CtB5P-_LFwBPQuc-uF-gP4IwXIB4GkKAmviHPngSzjz3Eco9ilNCvh5Z-wBnWh05rgVBP72Qlr55v6o3iZOvPvD9p74zSpq-rWQZPvFcmj_tPT24oTkkPUKLfDhN2hk_nUTGvnzp4T0tWVi_6S8RQO0eKj-t6w69tCDrvhrCJr91SxC_1OtDP1NLEr2bfIi_Ia4rvNeoMr5W-w07wyoiv6Pyq74-Vlc_jZq9P5wgAr8eeWs9uYaHN13jn76SvN67w4_bv1E-2j8ZKW2-_p2Hu2i5Cj6jXZ0-JuaXtS2QdL_Kv9k-gv6AOJlyBz--wUo_wGt5Pvq1ob8OvTo_Q5INv8cG2DokplE4NFD2Pp2im7zQqFo_Z1QDvt0lsj8i2U2-HyrovI-RQD1ggDK_YgKVPotBNT9kDWC8_kDwv2ZzTj6lhji_nThav4DKy72mRZM-t4oPvqdKmDsIKL06zeALPiX_nT-CMBOAiOkyP1QhV4DR1Y--EV6hvUufx73KryW_XhQiP4y4vT_BBy0_dntGPlimST9V6EgAyOh2v1dzq71aMEc_BkBLOLSNIr_yQJG-31qcP3Mc3j3BIcW-YST0PRjrQL7pySk_QVZwPKdJZD3hefw9tT2vP8JnBb4PDJ4_vuH7vijJ_L6q848-l1GxgNzYiT85GUK_VJvRvnP1Gj6CRWu_A5uvPpTY-D73NtE_lfphv3TrmwC3TJY8rnCdP6uoQz5hLcC-Fh4oPafbUL80Y_u9LRu2vnQDt74fsPM-Jsg_PtCS-71H6HC_qW8HPua2PD0jqCq_SvIHvSrORD-MQJu-zZEUPRsIo7yf6R2_51A2LjQS2r4h8S655J44gYwzBL_TAWc_fmYhP0JyIYFJaJq-VpIjgCoXP7_2Sd0wGUjNgIeoFDhOJOS-jD4TPcVGhj4u86m_veeKvpBRU766ZoA_0Nz6vU66uj5YiDi_H_DBAGde074kg30-5ulVPzAodj6ApXC8eJ6uPjrPkD5naWa_2f2avwsPGr_L5Dg_7xSyP1spmT2mP2a_inZdAFLRbD1XvZO-zooJADpUpb4U5Km_sTHLvy8b7Dzkmh--V3ipvY758T0OIq8-RYq9P7Xfe74MExM-zwMdPbOTMD6O4yA8-pPJOb97Tr54d8o_l3aLv-07pL7BGbW-l82xttveAj9ddkk_COX3vjzOlr6NcWm_jp-JABVCB7_ddO-_u6v_PcRZvL7nLJcAh29yvCtyKD49W3m_IMImAcYb0T4eDBC_vOSIvsSD4T5KQ64-rcbmPjzlv4CxWfM8rncpAVZ-R713zxAA71W-PoYIvz6vha--EWR2Pkgjij4oexa_DSD2PhlKJj9jP5e-MLByPzLQY74P_hwAVM1wPgByTL-d9PC-iwzPu2C1ZT9U-XA9yWmxtL83Vz9iijO-C5GuPvMlY78erBsBeLjou5sQbD_i1DS9e7uwPvz5Iz_vN2y-ppQGgPlp7Tel9F2__eF4OsvMZoDgOfWoAp8LAJrbubPQw3qAz38VgDBspoBHcGK2tjP7PbQqz7uKHoA_lRGePseINgGkaw2A0JAPvhcHlL_VZRU-bJ4CvIh1e7-3_0e_AG0EPqRBXbtTJtq29GiGvueE7T6ukTe_h4r4u9ckej6dGJW_chzcPrxPtb6DfwI_pyb0PW_FoL-yZ7W_QWYsvL3OZD_oWR4_AzaoPuw5B4D-Ay-yoNafvubqJ75MbkK_bXlhPg7hm70WsOS-71tCP2NfrrmgeW6-s4VOPf03jT-ZC04-oakPPwrhoj5Z1BC-f5tIvpLziT7xZqc-a907ACyjLrmscU6_MjA1gU6ugIBpKdGsv_8XNlRZlyGU2oKA3-NrAG_5sQAr4lkAPo2KP_hAEL8slOS-TE6aPl6mFj90BtU-269TP_scJj7FcYq98mItvhOPvzoIMLO5pUbtPVSZJj9Oml69xILys-I7Gj9pg4SAbrfVgC-2gT40XGw8tNhxvwE88L30gIg_aGvHPriBmT0u_s6-4kA9u_zNar_mJX6_HP2DPn_0kz3Rexq_f2xvP64rUD-_6cK-rMIzgM-GoD8q3zK-36r5vqFiMr3dbjU_niUAP6cBnzMFQVqA5g5VPrcZab8VlCg_MLtigHMH8r0BBca6Y5TBPD2QFj9SYqE-QDGHP2VIUb6NIS6_xNw_PNkiHb6bkYQAqeTXvh_AS7_q9mc_QY6_voketb3WlUs7k78uPfpXVb5_acI-Qa-zPkZcyD31m4g_ZPoZPXugKT9Qlc-8tATEvkDZR77qVjM_JP69ugauv77WvyaBNNlXvcc7vD6Vl9--HgflAVxjrr4wsRU-QNNVvjxJWD8iaOc-hqpfv3N7Pz-4UAa_m3DqPqRwHj5oEbG-dn6KvoYzpz4MaYg_PLAjvwd7jr9V40-_e-e2Pn3xW7_AI0IAOIfZv9W6275_u-E-rzFbvhXRAMCiiLi4sEPyPijEL4BFNjs_afKyPD-FtL4j5wiABvVCvnGwOL_0mZy-TRkyPZbh0z5S_j29ZHz2vRWlGj5tTZw-vocNAe02ToDewnQAIGFxAIvYAoDYvwosR6DVACF6qADxwPQAIJKqPtdFAj5ZSMY_BBaxvdaGyj7P_LE85DubP_KbpD741CSAkGVLvgmzID-80Jo-sl7yPqKUgD9yMWo_FKfEvuVokz-p2VO-uBZAv8mzWD5QUjUBqTCYvqjyEb9Kv_479uogN-bk_j3Gwe88-AoBP1n2UbykJM8-McRQvFA7HYBsmQs_NhmgPgcJHQACGJm_tqA2vyDnHb8UJP-A7FcNP2dlJb5R0Oa_k7_Rv0jLh7735bQ_DWmHvZ3iij__VOaArZjzPiz3E4DPFZ8-kJMJvuoCh77oOHuAD0FoP7pXGD_tdjw_8P92vWz2J77UJII0AZMgP7aKCL077JO2ccFHAFTkGwAcJUkAoQq9AHSWUYDIUmeASZvirhEcj4C9sgABvT9vP9hShz589UY9nuFGvsjqCb94Vga7I01kPuYwHz_2TGc9rJMxuudrjT8kszCBOlqZvGUa5TB3pTW_d5nAPmuYJTcYsga_w4VNP9ZCCT_mC30-vxobOVq3r79XyBa-UvPRvFb0Wz7D5n-_JL4VP4-KXz1lzIA-vhG2PsKuwj4re4G_DTrIvfDc8T6a-sU_GOeOvmaOFb-Lsly-T_PhvlEC0L-VtWO_UjbiPpM7Tj-IjxYBivj6PiYIwb4TyfM9WYR0PiXCKT-ZJY09FtVZvrkGtL-OrL2A8NHtvll3cj4JKGg9VxbyPgzu1b2Bs3i_iS_LP7noYj8cMKc_SjYevhUkrT1-Qbo3v6qvP7StnT7h4Ks-iqDIP7wwBb8FXyY-lQwEv4nyvT7RBr09PD8APoPyTj-AzIAAFE-qvz4NjDtyrAk_Qad2vgYZMD0Ux0c-b6uaP9HPBD7sMiiAV6nXPuKnjz3G2jUBkTMTPqVN4T68Sre7fVKZuJMnCD9Du5M_S8yAP9QihrwqIsy-o2N6uCkqOj9g5cQ9hhDePvjXgT-INHW8yVTtPpDOCMD27yM-U4ZCAL32-74RT-Y-eZK_vvvbxrxWr1E_kzBEvkQ0hL7-xyy_QlYHvqmfg77nzoU_Xm7CPC1hmr7YZnE_QFsTv1UT-T6a2U0_7v1mveP1Hz87bhU99TouPyRiGT89PZm70FA8AelxkADCxc48abeTv8xTPz4ba-0-dXAYvHL2lTxOEVq_CcdIPx_tyb6hqAO_40IpPyoznL4w8Xg_FRxBPx2vjT4VNBU_n7bMvTtSIT2UUou-35arvmtCITyiwymB5b_2PUUZvzpGkYg-BXl-PsCM2AADE4U-K_JKvmh-CoDElx0_iLLRvAjndIDOT8w-FaCeP3OTeT8i9kq-Ud9bPjsVFAGxrHI_LQ1eP54HIz7QXzK_Z9ruPMxvWb8zWtu-Sp4Iu95Srb59OpO_jTMoPwIqn7_9nzs-BWKPPsgJpj5m_bS-87mFPPbZaz5UcQcBVByuvph43z1_ByO_gYt1vv5zsb3z1Bo-gLCnvMKhgT_vc3w_yNqjv0mQCL4Q_Bw-BwAzP_YHsD_T_Vq-6_94PqqGgz4NOUK9x4g6PttuCT0JO1a_UuWUP7qKiz51giq-ZNmLPnD0XD-Wx-M-QeuCgKTDCr1AFm6AmyzqPo61Wj7RIxs-4RGfADKYKoHeTjEAUrVYgF2miIDOggQAxEblAMTORoAYvSOA_B1Zv-jFXT4MSgs-SEU8gChbTb9v2mu_TdVFPyyiKb6kwdk--J27Pq_tFD9YoUs_ubQGvkOdqAAd4I09CIBavO1xmb8h-h0_tcuCPzKqx765wAi_coDPPdsnAT5A8WQ-IxKRvsc0Fz8xhRK_GQCkPxhRgL3TqZO-JZLhPRNdiz_2SU-8q5HNPkKbbT_yM14_9aiNv85bbD_NNgm79XOqPpigYb1F4YE_8mM4AR1Iqb_UpMM-xdyru7baSz6ielk_Rs0UuEQDj7_X83M_0pDzPqdIr77PnoW-jhuoP1AO6r4hjVM_TtooPwTB0j5vTe4-r76FPeLRt74Mau4-OSx_vRxyNr7BatQ-Wf4hAW9NPj8t4Dm_zH7zvuBHgL3hegg-rr4sP9RsBz8wy9G-YXeOPM1tmL9bqy8-4rGkvh9K6Tvsi60-zNopvmIK4r0hWLG85KtTv_o8hb6xbwy_wab3vuAMmbZ14hI-iGhTPY6rXz4Ywb8-bztOPyj3CL64iFo-5AaPvhrQBADw7Bw-MfW9PinU8wDH4nI_w56Qv99OYr5d1Yw-0UXGgLQGPr9a9Hc-x1KOvjfzwD6nyoE_LihEv_Rx-b4-CqWAA84SgFozhYAyqXm_AW6GvcFa4j42Yqc9QrJkPowJ9T6gVByA9Q5zPuqFeAADYS6_pN1Lv2zgRTng2XY-8fRPuVew0DwWzyM_jOWzPw_l7z7JvJQ7S58ovbbJh79OOMe-9o8RPbfZdYBs4Ow7QsduPuoeKT-2EtA-l4pMPi_2Rz8RTEwAS2seP1mnHoBA9l6_kbqXPd-wD7_QODG-gHs8P_Qr1j5U4IG3LQMIO3H9OT6ewoY_fEDStDq_Uj6wkgS96Tn2PpDKoDsDFPe970IGsztPXj78kEq_XZ7WvAxIF75hZFU_4ILGPvyMsr7EgRy_d5Bjv4ww4D2wAWg-7r_vvb6NIr8A-zk9gs5Ns-jGFzVgSi8_jozgv3lsPgBS0YA_r16YP-a_SD6QHAO-3TKRvha6_j6xCwk_s9SmPpYAwz5i9gI_FuREgEfPQL9ivKU-UN1htXFuhj4BSAI-8sCAPwXvC75PM8K-fvoRP3Dr3IDEZOi-aJahPkoYZztyyZs_yuujPq3KHADYC_i-1fu6vj7LzL76qdo-msuwvpyepj7AhuC-B1WZPoNSKT5ySoc6atAjv8JHgz8POlQ-FNz3Prc7Pz_RB2k-TVDPvwbKBj8XYgW_WmRAvrbkub5221A-aGkMgZ-4bi_eTIA4cy0YgNl2CwGw52iAmuENgTmCCIG51iKATOakvgfvDYDmx5g-qUyrvc7g9L5Q1DGAAfOfPiZ8dT9bRxK-QJYcP0_6GD0Xdg4BOFM3v4qtiT7KdRoBAkUhvrn1ejy1ble_VOvDPGK6B7-KTiK_kPpHAIrsrD6r_cY-pnCtPrqKJ4HbHQfANZlogA1oZj9oUxo9O_rBvj_gh7_sFH-_H2C9v5iVNT9Gl9g8G9fbvupBC7-atb26bmNCvka6rACUUQs_KKMCPzU8Bz-mRGi-Yl2KPUOMgj8-H_O9NuG1v7WkGL8gO6m8oMN6vjhfPQALvja9h5fJvSD_Bz8agveAA_NXP1cYjj2kfRA92vm7Pm9zoL9eBDWAOybDvrMhTD_Io7A-VDOhvolCRb6KbiU_gMSkvV17k76R7YS0SaEHwGvhIz_n2Py-stbSv6-9sz7Ixa67RlqiOip_fT03dlU_NbYEv7aUd76PgtU-zn0ygVMpAD4Vb44_aMeSvtRscDyx5yY_Ny_gvoH4Kr_GApu_fmpYv_kdfD9XM3C9I9ygPlS3CAGmTbg9xI8PP_RCZj8masm86WDNvtMKDAH0gcW-6O2svkZfDz8atj-8RnI6vYcRuT1aTwC-AJqLPfeUGD8Z8ZK-30Y8gbYyrD2HsKc-rYnJPsG7Jz56h98-bbHAPj1GiT7_lAc_6B1-PZHpM75mGb4_9iYRP1INKb-Hejs_NBN_vY6aSD6UY5g_YUqKvFqHGb8H_4O_uF3nrhGEHwHvstY87cBRAK8gKgH4sBG0gdTJtcW3UDr1MwaBMRyivENX_byaBQ8Ba0UfP8S7nL8iHAGBvz-xtahFmT__oK-86pTjPoQRIT9VrIA-hBJiP2W7tr4s4JA_i_SzAJ3bP794HFc_8jonP_rI_j4w9mo-6O2ov1cBcz_Gnpc-i1jcPuLzIT7Bcaw9J8onv4TS1jzvIFA_xQrBPqNIQj76ZPI-inWuPgns-L5a5vk-tv9YtTHhnD3EvMU-3QoePaYoBb2ueUu_JzRbvx3kE77hWMM-LYOjPeWrUb0xsHo_mZ7uPgSr34AczUI-ClxFP3Dqej-S2BUAOoV6vgBYzT6vH3q8KQcFwFosaT5QMRCBa6arv788EIH4e428Z4ljPlHJoD_8hek-4x86P2v_HT8PDF2AfQ_-vs08074cgbyBa8TyPVU5mj953gk-lVguPr83CjyBxZ07fRnxPjv0ob-inUCAU6ofP361Oj9O5zi2GznigKjk2oBgBFg9GYzlvmpnf74PR_g-EyiQPQqSXD-Jfpo_lu8qALjlBT-bwYQ8Xd4_P9n5XAAfkUg-VQiqvUq5Gz48ZdW-jxe-v4bPM7-xzgw_JEwTv2SBEr_iFCc-KX6Qv_sWcr0ofmG-Fc6PPjXBZb9GRaC-lgniv5Oegj46s-y-5dNzvAzrV4CB7Fc_0gFZva90OT4Ppzw-Tx7hvLbVlT5zJWY5FPQav9VMh783qi4_OkACgQkAuD5vdWG9Id4dvaN_2j4PIK--7CLnvh7tMj_gM6W-v3mEPqyLEr1zYJQ_u8KVvwcdST7lVKa-SnKov2ei1YAgkJu_7AVUvxBRULsq2FO95qP8PJ7YDj8Phjc_nxQFv6ACR7qN-8U9MHxEvu5_zb9S4yuBrhPJvrg9uAAjcmW_PhMvvULamz6ZQCo-4YjAP4X11DfhEgo-L3OOPDsC0b5DWa8_h9wOvLvfg7zfhkO-zxJtvU6GtL4PPOi9KtfTP8ffOj5f0hk-4OceP7ahXL7yqFI_LM54PHdfA78WMsU-AFABvrRUcz9qZAe-KHW8PoiyJwBRXrW_-2sxPSerurZCikW8xdaKP14Bsj_NEAu_k3eqPRgHpT4CzCc-WfihPo5HVDm17Bc5tWVQv0NFqT5fPVa7GGwmv27jyL57hYs_yfkjvqW5qj1ITse-uG8Xv3F2ET_d18c-iE6_PrktPz8fN5A8i1ipPsggGAHgSX4-DiWTvfeGLT4IRv4A5dMKARsssr9dCyw-WnR4PUqSuS_Mln-_R1uMviza8r1g5aq9MVnCveGZkD62xvE_GXnfPm-wC76L7IS-x8YpP0-6kj7DDsQ9eMiAP2nEJz8FghO-fkQYP-nYeT8N926--luHPR8Jbb9DORY_Kg7WPibBVz8Qw4G9apB2vxOlrT5uK1i_T7mHvoxkiD0FeS8_-paAvr7xmT0jtRQ91AmDPj1lmj7p2wS_Qh3cvlNoLb5KWNM2XoqlP-AMhL326uo2a9nWPkj5Iz-ycVm9ooLyvga1vD7kXka_cUHVPxRHo734OhSANG5zOsAc877XNli7oOyjvqUQET8WDuk8I1xrPuDFzz60rZu-60eygMrmBz7ITEgAAjQWP0KcYr5SyG0_OHCAPaqzrgAlogC_gpKVP-Y2W71RhaM9ktudvgE6Hz9KRVi_fD6JPspXAIHLOqk-KTsOvshSBgGQUV0_5CTSPskaVjo0D10_JhVsvvUhMr5Qiko_iHKqvbmxMIF5kIi-JeXZPmA-HD_EJ8Y9B57UPqGVWT9seb0-Z4xuvjz1PrwHa8m-_vPhPqapmbzyTvq9e4nFPmC_mb_vnkK_8vGdvu0WJD6h8h-_1l5Dv0o20L6hTE0_nrfBPk-6_T5vCsk-6qwGP9RQsb1Qsos8x_U-v-s6RDwm1BI_ERaaP1c2AwDD4Fw_wh-nOI2x-D4kOIc-32eRgNpUkL_NgJG-70CMvwROEL0xzwo-mrCpPlpSPD5APZG_HKzmgBr1nT7awE6AgCVcm6SbHwCqzRqBwUQbAHvX4zfSwQEBRd6fgE4GIQDiBYMAPg8ePMIXk7744Q6-KBsMgVsHpD-KlXI5TzidPcT-BwHNNMa9ylzoPRPVWr8wV0E_IoA0AV_aR79RsT6_xrcdvmXcvr2E336AdVnDPNciQz-Bjhm_h_c5P8ASvT7aD_--BQjTO8zrJz5jyn489P9bPXe7mb8INqG4_KNjP0IBgL_SvFu6KiK3PkIOlIDvXY69zIWLPsQcvz7fILCA4D_qPk8IoT8iTlC-hx45vWc5oT-o1_E2ACz_PrtHFT6WuIc_W6-BAA07CD9H98G_xtxBveGGY70deRO8kc0XgcEnhwDycC4B1hO8KCKxAYFsA0OAsCzcAKL0MwGq9wiBwqI3PkG_er5QnVC-_cR5vm93_T4Fn8KA8_4Zv_MDqb-fpNA-ko6fP4gLIr7kpK0-rMLUPfx8ML4g3EK-Uxq5PsevGYDN2Yi-R1Vku832dT-8tZe_PDdxP4lhyD3BBRY_S0d3vhDjED4yUss-5IpVOyrqBT-cFXw_s8krv8thEb_mKWQ_zB0GAGVBbD68TCWB',\n weights2:\n 'UkZ7PkU_WT89J8I-yWs6KocFsz7U-rm-Okpfv7VFQ75JwDS_whZUP8HTxz9WoGU_bRLBvsNvG7_z6BI_UlcPP78wpr9grmo-SGldvXq-rD6k21Y_IWPrPlJlO75Oj3A-YQdNADfr7j41yIc-laBPv3Kbkj6GnW2_nUqHv1vZHz54w4M_g_2BP7RhvD0WHTG_jZUZP0cG7r6fpRg-xSPavih4rj4vPHC_tiRNP_ihBj-aioo-6FBdP2LQcD-2Gg2_QHGTPifpgL8KmRU6zNZ2P7G2m7-5_Ze-_XsfP8gZWYB_QUE-s5RtAAj9g7zgnty-gsS4vti1Lz__GqW_qdhPP0HVWz4PoM6-XudFP4FAH75_-Sc-TsORPwAGsr-efH0-fckcP9rZ676a6Oi9DQc4Pw3CDj_IelK_m0I1P6E8XwDCXa4_buoCPxGX5wBzHIC-ZFUJv7S1sD5d2xq_Bc5KvuJKBj99PGA_kHycPyhBET-YH6Q_5Dkiv_bgvz8oc8Y-v-xKAIo2kb8DFTa-04ROP7NwyD4xdy-_k-SMPwBzGz1PciE_mr06v3M5gL9qR2U_qqowv2aNxTs-uQ4_1xFmv5yNxL7eTDo_vKRGP3iRvD6eIWK_OFUaPzCHJLvcUsS-2TA6v5MtCD-BLGa__sMtP51VpL5amwo_V52IPtQGvL6OHQ6-y8VNP48WOD5bd8W-YuUXvq70ED9Tphq_HkFRvzwmNgEmK4c9-7hZP39nc79clV4_rCxRv7p6gr-ydHu-krLUvREogr9NLsa9XIXfvZBBFD-BFEI_kGRAvzj7MzsRTD0-rVM5v8dCjz6r1kQ-YX3NPmkJTj_mssA-nO3APLd4x745UJ8-uwkiv8XBjj_WDlU_Pf8qP9t5VT9NjcI-RgxSv_D0qb_COea_nxeoPc9eET5RPiY_NNhjvp515b9dtUU8pVUXP4JhDr41ZkQ_qy26PAB0AL7OqpC99F2BP4iVqr687CQ_gtcFP_uchz6ksv4-zTpXv01VjD-u0AS7_kl-PxR8Qz9eTto9AnmivaGKtb6KaJ4_i_YZP-Ysqz5Sees-3XqcvzwRCz-RCRO_PGuXP1pC-D6PV90-ja9hvk3tWz3zJVo_ANO-urrorrmvPLK6Ybmuu45qhD3c8T26LwUKgAlVhwCnBa-6X-bOtmf1sb1_V8o-6VuYP3sINj1bHYQ-j5abgAAlwr5g9Zy96xiRPu_dHr9--se_Ao9NP3SJFD-WeSQ-7HKjv-qN6b6Z2k8_Z5fYvra6rD5jLZq-iCggPsMI0z5HTQi_0EJsPmXItL77HD--byXZvvB7WT-RPZO-HLtPPntZIoBUMuIAcwokAWWb6YDKJjwBVsoaAMmwBYDz23sABvfsAOghHYAW0qy8Maquv9WzJz-Md-U-ofRHP8Lek75PsOY9kFqDvioJur9Uiwq_CTMYP1OQd7_t-Qo_RjqnPimyjb82CRC_nkSIP5flRj6KCcw-Zv2JPhNcW74Lijq_3WSKP9dzXD_WdVi_b3BvP4Kdpb1tZTm_Lg7OPggMmz1EmiA-qKmevjNK-L4ekqM-LggBP0Y8Gb-7SyU_43_qPYqfYD8Rwne_EZeOvQxooD8TLUi-W8olPjgD7z6ZTcY-StGVvkvDYT-G3EQ_U6aiv1HmUj--Kvo-c4IcP746FD8C7NE-soTOve0nmb6wQvq-YUdhvnVtkr_aeU0_j0VnP5tkAD8exgY_MTmWPrSyY7-NaPM-8Zcxv3K1XT9Gigk-mpyeP5K0GD-Bb1M9UEg1Pwbew76bm0e-aqh0P8w6FT_6CXw_jchrP7OapD25aZs91V0Cvy-DCz8ZbvW-1l4tP-nqiz8uHKU-b0d3PZ8QqT7Cs6U-FvN0v5gDVb-KUp2_rhJNv5USaT-I14u-i-QNvT9ooj-ciyq_6SB_gAn6Gz_HUS--rYsUPnrimL-8vek8uuPzPmNfYz9_Kei9uOxHPJaXgA681ySA1wscgci35oDy-OGHZ_YVgZjpgaw5VCqADY4FAX-xxYBEuvC-_gB1P2DhYj9zm20_nGfAv3lVjj9zpAq_v25MP0QLvr4Ws0e_rzEYvxd6uj4qFXs_TjCLP0m-jj2GM6w-qGx6PtcRdL-32wy_1Zqev2JAjT-iXeQ-MmF5P-2dlL2Jnsw9qzPpvn383D7O8oi_KAdgP9nftz3nTSo_lDXqPoNeXD87nhw_p8ZYPwXrhD8fOzK9tRgLv2-vyL6JX3i804gOP_ZAFr5ZWEQ--fsmPwV58jx6IIu-bUr7P7ZIHD-ffvs-dLzFvt4BGj-alO4-qQdFvybYjD-k7tU-kWhBP49AHL9F33E_nkPlPcfM1r7RCPg-69zgveiJIb_QueW_XcBcP18z4b4gsrw9p2TXPlylRz_xvLw9nUfuvqaHgr7iVI8-ctjmPupWG76fVjq--e3Kv4Xh8L5jna4_jV2sPmFm5D6KkL6-50OJPmShMj-w_Z68JQI2P2TTAz6P8q-_ACpJPxjwMj7wjEE_txuIPgpxGj8QVpk98s7bPt2FTb-msX8_auU1v5qyuwAiAuQ9en9Fv7ibFL0A5zu-ZZILvtbNvT8uelI_bissPL6PL79Hq2A_70Vbvlc9h79OvFg_L1rlPtvGnT-X0MQ-p5NBvzOyoj5nwXc_WfCOvuRGeb_cPwY_6D8Uv3UjaT6nu5c-1awFPubVlD_PjZI_z8X7PVNPu74RwNy-OBMovx7ERj8njUO_oqmCPwtNar675fE9hCO7v4IdCr8egaO-7UE2P2_CXIAmKwCA_tuqgGYxUKewZPAx76i6r9bvNx181D-BLB1pgFn5F4Am2-w-r3WWO4ZVjb_8VTk_mkMyP5hn8z5UVvs-D8KCvSCaTz4hKG6-7aebgIKjZYA5oi8BHbcWgO_7aABv3lIAYbWMgGCxNgAFP12As1T1ABQYIyVS-A--1QeOv7fXSL4Kij0_lz-Gv1_7XTs_554-J3ANP4VZzD8V5gG9f-eTPzkPSL74mRK_m8Q8PU_Zkz1j24Y9UxqIvcVlKD5AVHc_ADp-NV5UmS36fkKlA4zFoSpNGwCj08exf2ilstrTczuxa-Ktc8Pxsb5BkL_xEKE-yukgrZsk9T4Lad0-oZUfP-jiiL6Mpcc-lqCXP9dljT4bxNY_HYkUv53dGr8mfNI_-z0JP-FglL-tHpg--zRvvsfZmT8BmEw_sZkIvYOFFD-g_hI_9ughP2ipmj_H1D0_uDs3Pz3mhD-f8XW9_cgGP37YNK-6tXC_LFbCO7RrJzIThRs_qryaOl9x5by45YI-r9lFv6_wi77BkIg-gCCJPo9-fj7HiJm_GW15vwSAk7-Hr1O-pD_wvdwUDTg2x9g_-x4HPqfUAj8tXJw_eUfWvg3fMT8wR3I-oHlpPiAHbr-ajco-nW8nP6Px7b4nhoU_X6jYO9TbTr-g1V2-z5CXv6GcpL-YYSO_L2J5vRlrP7-zkpE-L7QDPr6A5j_OOp6__9fjPj2VVr_FR4m_nxlYv4WOaj_bdUE-QktnPnvRr4DZnW-9A1cDP07khDwP3gq8ZQnSvsUlm78csAq_Uk1JvifMVb_voi-_ySiMvZpwLT1Sghe_opfIvy4pPD-Vzac-g28vP61-Bj0yqw8AjHy6AKY0lQC27iYBvGEUARdBKIAC8CYBAqRhANstAABD4jIASc8NPn56jz87JgY_NVABK4JrR78w0yg_f0OWPnfZPj0lDJw-ln3rPgg4pD3X3rg-GFgBv5ga3z3mCIW-b-PQvZCvzr7RSYK_lIMEP1qmcj7d7li_s6jDPv_XEz1gPBk_v2ooPpKKMj9Czau-DQqBP6dxIDxYbZU-mTGOv0u0Oz9zTpU-Edd2vlGYgj2msyS_neoRv_XcKb8bxW--n7iys_j4b7-Chi4_VOn3vZKRZL54DRO_H1eOPtGLXD4yEA8_k-ZUvo2MDT7YfgU_dXwLPvP2Ez_Jny2_kurKPnNooz_69bu-8v22P3KZ3z4_7EI_O13ZvmnDyT0Z8_A-jFecv3lKFr62LXi_7CxtPz9pJT8xqxs_UINSP9JDgjr-UOK-pCmJPwQBjb--i4E_2FQEP1BDID9aMIa_yIYRvt2LlT7WHy--3wy4vaV8WT0K3DE_gNGWP5nGRD79Fdm-va17P4gUsD7tvi8_K_JsvxvbeT9Qcwi-XLQaP3VqK74f26o9bhAUvzRiq783BSE_r9ogP5d5A7_d8Ts_qbuJP7UCuz4Mh28_U_2Uv7yaXz5prF8_SZ6mPqhdIT91waQ_HlKHPwXsAD9R84GAnqeKP1ReDz8yD1M_ngzQP5tFYr8xMna9ZyvRv6GEBD5zxka_2MJyP8YLsT679QeBCtrXvnl01j50n9U-lsIqP7VNEb_rMsw-HtEHHuaIHr1DuL8-qkcIvxvaLz6ex_S9ULG-vPwQj72EVpi_SNp5PyhOfb97QUA_4euSvos-R79I40a__TZav0CcYj4IVME_7HOIIdibHgE1dGWAXn-7J8pRLgHPXYwAGGtAKKzbgowV8v0K3vAwASiD2j8io3g-OD8Pv9Av9D7m2xU_6rlRvxjCLr90xDe-gO98PfrZzz0RJxC-OvGIvfdxSL-rx0a_hQxiP1gQfj_I6Xw9XHTZP1K0nL4bhRS_ED0XP4KuSz9bkLQ-WBoDvz5ZA75W0Bo9sSdQv_I5m7ylwRs_KcEwv30M8b5Qxkg-K-4VPyutAz9tFeC-_78-Pmy95j7X1Zk_uQAaP1MrK7-xLj2_dVg7Pwq4WL-STEQ-Bnm6PYaLiL_VE4q_x0XEPg1FtL4V2Sg_CQDcvLKkEb937b894smLv_x3EL9NRYU_tFRmPwxMYL8skGc_IbYPAeNs5ACwXw-AmZwlAZlJJYFFeegAsLPZgH5XFQFi5ReAjez4AKkEr4C8-6S_Vb17v4ZL0T8rzhM-IrN6vmocXL9WoIw-uqtYPxuzAj9szZa-_vUeP94Zrj5NSi6_JsuWPgeVLT-YoJU9txCSv0V2Z79i3uA9ktR2P9_4xb2aazg_lyM6PlUPDT__vag_yCcZv5zXLD67dpG_Kcb3vrWqor7mjEYo7t3tPnYo3j48Dno_JgmoPYctc7-WhKg_9JvwPbc3cb9SHoY-pCROPyjXZz5iSNA9lLfDPnFsRD9zYkm-gvR6PmGKbD3WzKG-sOn1PgeTEj_60A4_erGhPwQqKb95s4A8gaclP_-DgL_KdIs9gwizPuVjMT_iJM-8Py1UvxwXSD9xUXy_rsO1v1XuNT5vLnY_bDsRPpyBlT5UrJy89hQlPr_09b9hj1g88jDjvoqawz9Kt0c_xg22vqGA1L1r0K-_Pi9Pvu8evT4rEi6-6jqUvgGuIz93TGQ_DiAJvhwSgr80gQM-raUIv6AqiC5E-6Y-FuVfP3I8Fr_oPYYA8bcovwTg9j7UcnO_FZaKP5oiGbwB_ts-uEAqvkyVUT8HjnO_eoCvP2jtcL7xeLE9rpTEP7fJ_j5z7dE-5sU5vMiLBr9p9_u9MV2Avd2vAr_45rG-lVIBv-xdQYBNf9Q-XScsPwtuQz9DvcW9Xp41PzyFF70jkzG_EsXfPgQFK79CI-O-LqnjPnRQSr6GllC_-0iavyKJ3j63Q7E-37Sovj0n0L7UUoc9s7LgP6j8ZT-tmC6-Kd_KPlLxmb5GVZs9PZClPm2LXb70zn-_ZznEABKAnT4JyAu---yAv16FaD9h0h4_5oSfIp60iD7ZE8S-4JyWvzc54z8mOQs_hKSpPJI38r0u2py8Yfh5PZP0hD5134A_XqFpPs369D1Yjpu_IjAIP3CnwL-_xV8_bH0Bv0DART-wRLY-90XkPoT4Xr8puqW_GCNdv_rc6z4hvVG_Urx3ADm3s72mBzW-nHa0Pox2Lz_h5o89bs5Rvr3tT794a8y_qfCXv5Hsij9MRbu_QRvqvgeRwr9zT-S-vP5hPRSccb_V-Gi_Ccz9Ps9rqr9hpv0-OAeVv_1ihYDEMcmALmKRAKaiGwBSwwEBcMZDADMmKwEW1z6AtcFjgMIyUYBAm50_87uIvjPeJD-LKZM_oWaVvq2RT7_RpP098ZjauxOycT7-Mj-_L9A5P9QdZj9NYIM_c_wqP3YuAz8XFLo-nHr7vmDqVb8JQnw-e0H7PhAhBj5qJuk9x3DxPt_zMz9Ev1Y_UYIuv_0SgL8v-04-hoFmADaPfD8_Rz0_F6SfPPbdOzzEEcYcBtsGP7PmhT7xI3g-QQCTP6-dRT9Yymc-M07jgJPA-YBFkniAFwECAKhDpwD4aXkAnZH0gBxduYC2mxSA5ADhAKyImz0ldjw-slKXP20goz4rijk_psYHPw5YEz-QXpy_obhAvoqwg75ehNK_DolVP9AWv79xqxoOL9Gov6FRhb3NKmW-45AQP8v4nD6CRR2_xtAlP2l2VL1n_li__apGv1XOr74X-Gg_m46svMlS5ICe_e8A3kAFvxo5OD3ubJQ_3Ti3vrRbmT7iBUI_0x0vPxdlND1yiEu_39Jvvpid4D38kOMA3hVMgF4bVIAdfRcBrFkKAEmYr4CIzQgAKLALAbbPWQAAqQ2BZCbovidyRr_k38E-ZrybPmwL1j6fJowhEUVzP_r1r76dEiO_ay3BPrsIiz9jD-0-NUOCPvCB0T_ggBm_UoEqP9TZQj44kwo8W_OuPsYYeT5vk42-ALerv9tbrD492o-_JQUDPh-SxzyzRFe_ohuXvZlyhj9YXwU9HfkdP7Pnr7679u2-8bxCP8XzVD94Oxo_CJpZP8GgGD_TpNc-BQmjvsdNFT_ZNgk_UcSXP0mFoL4oWkY_qqTZvsgQ5Lox3-y_47x1PkV3G78=',\n weights3:\n 'w8mivx24Qb_1lfY-x7snPhfhJD0wJVm-n5WWv-cBjL9Bsb6-upd-P1ST9z7Q1Xg_NCngvrtkV78AbEO_oEUOP0YW4b6jn3E-o4vvvdrMRD4y7-Q-IF8UvZKplb4AEas9CwLAPjiOAT_JlK2_KumLP6HqhL3jo_i-dNUAACRjWYDSKzgB_hMcAabRtYDQF2iAOKbdgPki04DQqmIALIGGgJcIkj76_X6_g1iQP_Lgrz0kll-_etlhgBkgpT_3XRO_duGAPwlOiT90QGc_yNYzPqEnWL86wBY_ZVUvAUZJor_20mm-tL-DP1vw0754O4q9PlGAAOoW2QDILA4BCeMugUTjJoCSxLUBfEnCgJT1LYB4vX0AdJjsgEDmvgF0RicALOgrgV9J2AA8FwkBb3UEAM158IASeh0BraSqgL67NIDOLGcACoIyAEqcIAH0b0UAiQwcgIdBfYAqXA4BWlvngA2yRQCS95yAQ3UDPlAM1z5mfEw_GR2kvuksez8ywIk_J_5KP--FgL_8_A27eYZ0v26tzL6hKZc_B08PQJwmAL_WB0s_iC2jPlIhUj5VZN8_wAQNPTgd4j6AoBqBiF1EgJqqJ4C2yhsB_uA1AHfbn4DlkaYAKO2OACisWYAk5MuAI_OZPoviir9zO5a_mPTRv3R83j4xnbu-NnJ4P1Qviz9z4N08GeC2Pu5w-wDonBMA0E4sAfGeXAAIPoeACGMygYyETIA-nvCAoddmgMSiVAAkh8q-UhQ6PzWiEr-I5Rg_ggf-Puimhb-zpLW-8cmKPyq1-j4ZoX4-Pok2gS8uK747L4M_qkYyPooo-j6qVACAO_skvtqJkr35KI0-a7C3vUK2Nz9iKPk8BMC2PyF2K7_I-hG_IxJXP7Lkz7583Ra-L8w9PPUk8D4Qex2Ahg4PgCDChoCmvguBBsVNgDzEEoGS1xGAsNQDAV_8pgDA7qUAlp-_PqZerj6O4b2_yFtjPmr3tD_00hk9LHzoPqL8CL9e7hc_ufKqvqDR8j4WUcC85YhnPycvkT_FO3yA5dTbPZd7Sb8es2k_03OpP75-sL8i-FQ--CoCv2RVCT9xkj6_KeVqP04-TT3Xwbe_RKXZPh3umr6RpH6_81yVPnfA0r9q4-k-4UwTP3X9A0Bj2gw_jD2Iv-Vcv77UzzU_ectbP1uiBwCUBcSAbYx5ANvIKwBgpOCAhnMfgIynBAH1DR4B6kpuAK76BIBmgmg_EPZnPzKZpr8vY74_10XTPgc4gb_jHzg_SeJuv-xaaD6I1Om9505lgFyuFYHv-ZmAx51zgEam5gBwqR2BUGpHAKtxMgCOom4Ah4-XgAg5yL_mCG27__W7vhdCfz-Wzec-izphPAMhUr4Uf42_TrdGOMv2tL_lzPM-fqaBP_nhh7-Ewv4-Xj5iPLIC-z7Eyts6SEFEPxJDLL4Uris9-F_CAC4qU4DxSF0AFBsOgDZ0RAAy2BqBRLMiASyUNoAY-sWAqc0hAHCzj71IUYM_xJKmgOs4vT6dUxM_0UfRvE50wj6ZraQ_PNd4P5L-WD-GTgy_RA2nvzSMELsGWD6_p4FpP20OVD8WHAxAPp4BP4e9YT9IJZM_Q7KEgOKhMYBc3wKAtTmtACAFJoHHS6cA6MHngMLMdoDMRxEAuqMGAd_yLwDI0CYBNooLAXLDJQCAth0BGtkIgZiXjoCedbcAKehbgOyb9gDT1eU-QTCNOdAUQb_lc4k_iSeZPJUAlj-gcby8fjRQv5H9qb9Fibq_MCoZv_KVxb--6pc_eN99v3iL1b1BbYW_GSmTPsoCJj9VVWw_Y_eKv4f0BwGyxQKBq0m_gDzgGwE8ORqAqB0sgK5EMoGkXxIBQ2AAgOYnaoCUayCAOQu-AERVP4ADYikAebfhANYm1gAH_RkBcRoHAfW0FYHCwD4ACs9kvex5kT-B5-Y-mUcOvYzfaZlQrp4_5mvmPiz1Xz-fR_S-9Tq8vpMUO799Vrm_ExBRPQtbH7-tBf-9ZiO9PpyNnT7fy1c_oWmKP45yCD9aPjU_0cjAvr11ST8PP_u-G7DJv3YHiT2hgGkAUe0evpGQoT14Bzi-sSVev65O4j5-OhG-ukaVvinhjb58XK-_TKw0PhVJY79z_py_mip9P8zqGb9tfvQ-fn8kvtFbFj_-drQ-Mms0v1noLD5zWlI_0kjVvQKPrD4LB3c_w6yQP_9ok7-zCgw-c5q8v7-g2r7Og4-_HjBIPnAws71a6_O_8i4TgJTzd4DAnb6AlKK8ALF5XYCvlCeAYfKkgLoENgAdhSkA9vMiAVStuwANNc0AYNUGAToxFgANUbqALXOfgHqgvoCfSsIAU3QTgILH6YBlx4I_il1_v4VsB8Bo9Wa9I0tfP4TNXD8_5qM_4rvivoqglL94AJc_VEAHgQgMHwBN9HIAY23egNieLYDdmzaBWBc8gXmZNABujg2BtI0mATtyfYBxEBYAfyhlgOssqoCbFKyA-_upAEJC8YBe91cAzghogByy5ICqKgmBuy8UAa0UVAACIRcBTRW-gKhgJQCjEK2A9rnHgBjReQA2NO-AF8jsAEB0P4HkNSyB0UrQgF8_KADI7KgA6gZPAEUL2QAG1RuB14UcgRL5pwfk36k_nlk6PxK2uz_bzA2-_4HovQ7Ehr9k30I-8kvevkQuQDzrKKU_KxodO1Ge2r4PYhU_abKov2--Fz-feI4_m3HEPZxBOgFpXa4-GnhGgO9SGIGwiLKAPtMuAfDBBYEanMSAYl1cAFw7BgAOTegAiADagKmnb7961R-_8SrqPyugCL94qY4_Jd1OvuLeSr89J4e_ubrEPbftnr9Smlw-_ZOOP9Ueg74npbs_sAU1voQpLz9CI2s_2mFTv7KxZb92OpGAQhyJvgTBIz7aTCQ-EELiKPT9OL1eMrC-r6IsP0uPgL2I5Ym-F9z_vAR8JoCgAlyAww9lADh2FAEATneAkyW5AGobMgDRHmuAkxwbAFBIbACwZyu_lFFdP57Qob-6tj48bUBXP83MLL-fmw4_EIXBgI8trz87yZA_SE7ZPBiIST69LO4-CeMuv4c_fD-9lmA_ERanv0J5cT_yisG_LRfHvzF_aT_P51M_98QmPFQBYD8w0IY_tHMWPnQ_YT9Hc0e8f0Rkv4YfFb_Xe0C9vKmOP12QI71kdgo_egCBP5Bxs782y8k_Lp1DP6uFn79ajh0_4l3KPHM88j7ceaQ-fs5bP_g67b_r6Fu_gu0xv9PNsD6NE00-Lo5tgAHK6gAXPh2B49U-gPvZ24BKQtEAqho4gGhVL4FAK58AL0MTAbuzPoD9GGe_QIY-Pqtbaj9YGcs_kyTKPVNyYD_G61U-Vyrxv4Kj-j7DHgU-AhDvPncKwD781YE_OKs_v1yujz-6HaO_wfSFv5sI_j3P_xA9IJdIPw==',\n weights4:\n 'gu1Wv-fgtb-3SkE_xEOnv-A4ij_-05u_cvM3P1sgzj9wh5a-rS20v_zLiL63nA29A4SBP8u42j8OYi-_UPH0vzHVor6TlNg_vLqUPwAE6T6Zvr6_XViNv5uOr79ybXQ_ckpHvwCXvL-zNZ6_PKQZP39AeL-zmEa-nToNvZkjgD6BrmE-mWUyPz-AxT_9hYG_cmGfPvaRvD_FXd4_qbnvv8fSK7-WoLC-gd2sP82M1j83SNe_-2AwP39FXb-siUy_iVYBgSn2OT8QGN6-_4KlvwiPNL_BzZ6_8wbEP6hC7L9Ccyo_816WP_gTOT-N5D2_NHSeP1tKjL7EfIy_iz8NPtAhXT9x5p2_5pPlvn2e1r-NJKC_L4cCPw==',\n biases1:\n 'HaMhPSUacD4uCSc-waqzPlqCDT8oeeS9s8JDvMixgD9G0HU99_TOPmoqOT84tao9RdMQP5MqVTsb8UY-2EtmPnX_kT5d104_rO4BP0MByL7C_rs9ou2hPg6RqD61UzA_V7EKvpCxoz1787A-PqvcPY_jBD8cQK4-njzbPcUuzz3Y-as-Y6Y1O7-htj4EdBM-OqgtPisOBj9ZUis_WFRmPq23jj5ZKG4-z0FTPnM8Hb2pfqw9dTMTPjuQOj6zPoc_CfUDP4of6D72AXo-AXZlPjhNHz85-mI-YZ4MP0Ydbj8Egra-dB8mvvPa_D3H5zk_gpZaO_ckIT_HUPk-cHj9uzlXR7sYwTe-ds8QPyiXLT6p3R0_P-DxPmGGc75olzs8Mg9cvTF7lD7v01k8-GPWPtNmG7v3Ars-1C4hPxUtrz753i4_zFtWPRq2Oj77BYg-Chj7PrV6wjsYsRA_QANTPrLnsj4Nk0w7ebDDPq5J8D5bTds-5j5vPmJVOz8693c9v3rNPjZAJT__FtQ-N45XP5DoDT6aKw8901n7Pnr-o714t_e7bq-GP1qwzj5BkRM-WugkPr2vhj6PCPu9AMu7POzDgj4gWtk-07c_Pmb6Rz5aOpY8DTi5PntEtT4pMAI8PPuwPgrqED1Y3g4_iw3JPpeWrj7X3m6-bvjhPpD3k74T3wc_gBtoP4CGHD7JUoI-eAODO4Ko_7yYG6c-vQibPjt0Hz3nPwo_6lYPPRcYhL7UGPA-FZArPBI93D15MXg-iOYxPtoUeD2vp0M_hpGPPcM69j0dFfQ-ZXrtPUYKIL2Kml86dmvsOzwZ8z7fkWA-HASOPujnjj5_Wim8w0LevOWA_j22SNY-y1JrP5sbSj9-4wc_gCeqPqN3yz5EvUA-jnw_Pmaf0j5XGLO-XaJIvtiqqD4dbuQ-k71jvr1AuD7D_gm83xsXPqDoKj_Jr_I-qGiHPQKXwD49e7c9wpJiPiIk3D6-lY4-Oj0Evt7yEj-kEUA-wH0lPxv4bj4GXRU_V5nRPdTrkrmUuZ4-sm7JPagP_b2BV_I-f63MPnp8sL6rCPA-8lKjvC4ISr5j8L66i7W9PtxOSj0Ztfs-GHCdPkHXCj4bmgw_KMIyP8U1lz4wJLU-zwjSPovdX71is7M-f9L1vVAWrzywRM-7zugNPgj3GD-LPUQ-GzR3Ppz5Kz-ojwa9Ttm5ukuVqzzaCuG-Bc0lP1NCsD5PDr8-PQbsu0x4RD5eP3u8d41VPshsFT8WXe8-v4-sPuQyPTxAt8Y-hZ9ZP3JegLnbLLw-lBYFP6-IjL3Ff5Q9OdC2PfUMPD2dfSe8lPazPvr40D7KB8e9eNKKPh2ytL2LJh29m5QRvA==',\n biases2:\n '_Q9ZPZ8GQr68UR8_IbJ2Pgn0QD3ybP--wAe3Pr8LPDyG5vE-JygwPw57CD6dyKc-PvBtO3AsXz5wQkM-8ta2PVgSHj0EG8M9oeQHvYAlIj6P-K4-rgdMvv3T1r78Nwg_WJPNvmNOPrs7Z1M-YfB_vmU6hD31XyO-gwFPvuIWVT7RnG4-LEsBu6rKJL1BSMs9kpOqPvgulb3bshQ_GH-EPly16j1bVQ-9dRfdPb4vpj1SrMC-VjyfPi5kDT_e3bE-YF5Pvnm-DD4nKps-r736PiXlib3QgRq9CR5NvrL8Y72raiG-F2VEvtp2jj0rrZ0-eedGPif4LT1RsNM-yPdjPuEGyj6QCbU9cdj3PvQ_sz4KySa8dQtJPxBaHz_t12O-aAIuvrLxT73b_Is-ec-IPggFAj6QyTM-V3DdPh-MzT3kryY_cRhcvs7eCr5QbPE-R0ElvfyJYr3bJmI-Mug7P5pC1D2vgVw-OWerPpKaaDxWOMU-mbuzPsbRDj4k0oG-KY4bPkFV3L3lR1W95YmoPr6wm74Sw849kR5XPny7ZD3-VIc9YRnrvkyBKT687LK7zJ1cPn5RPT58iKM-j7JUP35YBbtj2xM-5iTiPpbGlD7Fg98-sfPwOVsRtj7kJw8_8ROJPvw9gr1riY-9352XvikwIT6I4Ys-PaVDP-hO-z4=',\n biases3:\n 'wYidPj2HAT5ogRE_KJy5vPa4CT-Bw5o9fDn-Oqwr6bs28Pe7EmigvVmRFT9nnR-8PpSnPjyxt7oQA3Q9QS4dPbM4HD_csA67n_nVPdZlV734fBc-0ZiGPaXTm7xPqHM-WuOeOvb70T5tSAo9RrB3O_T07z6yJgU-NlsJvfWmYTxowio-sYzsPuR6aDuZaA46p4vsvpKSMz-GgnO9G2TCPpUkeL4rqak-TXy1O3wymbz6qIQ-Ik91Ow-Qyru3IQs7masouyAwmz4H_DQ-F-jruzb_6z6gV-E-IElNPfpB5Tu0ASk-0nQZPmGwbT1yjG4-sLBAPhSGRDzcpq4-dqjMPg==',\n biases4: 'W7ejPKPttb42hDE9X2Z1PoV_Bb_msGG96ga8vgCSVz8b6KO-1rKUPg==',\n};\n"],"mappings":"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","names":["eo"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bergetai/ui",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Berget Design System - Scandinavian-inspired design system with console aesthetic",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -19,6 +19,11 @@
19
19
  "types": "./dist/shiki.d.ts",
20
20
  "import": "./dist/shiki.js",
21
21
  "require": "./dist/shiki.cjs"
22
+ },
23
+ "./neural-flow": {
24
+ "types": "./dist/neural-flow.d.ts",
25
+ "import": "./dist/neural-flow.js",
26
+ "require": "./dist/neural-flow.cjs"
22
27
  }
23
28
  },
24
29
  "main": "./dist/index.cjs",
@@ -45,16 +50,29 @@
45
50
  "tailwind-merge": "^3.5.0"
46
51
  },
47
52
  "peerDependencies": {
53
+ "@react-three/fiber": "^9.6.1",
48
54
  "lucide-react": "^1.23.0",
49
55
  "motion": "^12.38.0",
50
56
  "react": "^19.0.0",
51
57
  "react-dom": "^19.0.0",
52
- "shiki": "^4.3.1"
58
+ "shiki": "^4.3.1",
59
+ "three": "^0.184.0"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "three": {
63
+ "optional": true
64
+ },
65
+ "@react-three/fiber": {
66
+ "optional": true
67
+ }
53
68
  },
54
69
  "devDependencies": {
70
+ "@react-three/fiber": "^9.6.1",
55
71
  "@storybook/react": "^10.4.6",
56
72
  "@types/react": "^19.0.0",
57
73
  "@types/react-dom": "^19.0.0",
74
+ "@types/three": "^0.184.1",
75
+ "three": "^0.184.0",
58
76
  "tsup": "^8.3.0",
59
77
  "typescript": "^5.7.0"
60
78
  }