.svg, cast/gallery.html and cast/CAST.md.
+// Usage: node cast/rig/build.mjs (all characters)
+// node cast/rig/build.mjs kiko eve (only these; gallery is always rebuilt from disk)
+import { mkdirSync, writeFileSync, readdirSync, rmSync, existsSync } from 'node:fs';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { render, POSES, EXPRESSIONS } from './rig.mjs';
+import { CAST, COMMON_EXPRESSIONS } from './characters.mjs';
+
+const CAST_DIR = join(dirname(fileURLToPath(import.meta.url)), '..');
+const OUT = join(CAST_DIR, 'stickers');
+const only = process.argv.slice(2);
+
+export function plan(ch) {
+ if (ch.full) return Object.keys(POSES).flatMap((p) => EXPRESSIONS.map((e) => [p, e]));
+ return COMMON_EXPRESSIONS.map((e) => ['neutral', e]);
+}
+
+let count = 0, bytes = 0;
+for (const ch of CAST) {
+ if (only.length && !only.includes(ch.id)) continue;
+ const dir = join(OUT, ch.id);
+ if (existsSync(dir)) rmSync(dir, { recursive: true });
+ mkdirSync(dir, { recursive: true });
+ for (const [pose, expr] of plan(ch)) {
+ const svg = render(ch, pose, expr);
+ writeFileSync(join(dir, `${pose}-${expr}.svg`), svg);
+ count++; bytes += Buffer.byteLength(svg);
+ }
+}
+
+// Gallery: lists whatever is on disk, in CAST order.
+const cards = [];
+for (const ch of CAST) {
+ const dir = join(OUT, ch.id);
+ if (!existsSync(dir)) continue;
+ const files = readdirSync(dir).filter((f) => f.endsWith('.svg'));
+ const order = (f) => {
+ const [p, e] = f.replace('.svg', '').split('-');
+ return Object.keys(POSES).indexOf(p) * 100 + EXPRESSIONS.indexOf(e);
+ };
+ files.sort((a, b) => order(a) - order(b));
+ for (const f of files) {
+ const [p, e] = f.replace('.svg', '').split('-');
+ cards.push(`${ch.name} ${p} · ${e} `);
+ }
+}
+const chips = CAST.map((c) => `${c.name} `).join('');
+const poseChips = Object.keys(POSES).map((p) => `${p} `).join('');
+const html = `
+
+Swarm Stickers
+
+
+
+${cards.join('\n')}
+
+
+`;
+writeFileSync(join(CAST_DIR, 'gallery.html'), html);
+// CAST.md is generated from the trait sheets so the two cannot drift apart.
+const md = ['# Cast', '',
+ 'Generated by `cast/rig/build.mjs` from `cast/rig/characters.mjs`; edit the trait sheet, not this file.',
+ '★ marks the characters rendered in every pose and expression. "Look source" is the reference the design',
+ 'was drawn from (used as inspiration only; every sticker is original), or **invented** where no appearance exists.', '',
+ '| Name | What they are | Look source | Palette | Trait sheet |', '|---|---|---|---|---|'];
+for (const c of CAST) {
+ const pal = [...new Set([c.skin, c.hair.color, c.outfit.main, c.outfit.trim, c.eyes, c.accent].filter(Boolean))].map((h) => '`' + h + '`').join(' ');
+ const acc = (c.acc || []).map((a) => a[0]).join(', ') || 'none';
+ const traits = `base ${c.base}; hair ${c.hair.style}; outfit ${c.outfit.shape}${c.cape ? ' + cape' : ''}; acc ${acc}; prop ${c.prop ? c.prop[0] : 'none'}; emblem ${c.emblem ? c.emblem.shape : 'none'}`;
+ const src = c.source.startsWith('invented') ? '**' + c.source + '**' : c.source.split('; ').map((x) => '`' + x + '`').join('; ');
+ const what = c.role + (c.note ? ' ' + c.note : '');
+ md.push(`| ${c.name}${c.full ? ' ★' : ''} | ${what.replace(/\|/g, '/')} | ${src} | ${pal} | ${traits} |`);
+}
+writeFileSync(join(CAST_DIR, 'CAST.md'), md.join('\n') + '\n');
+console.log(`wrote ${count} stickers (${(bytes / 1024).toFixed(1)} KiB), gallery lists ${cards.length}`);
diff --git a/cast/rig/characters.mjs b/cast/rig/characters.mjs
new file mode 100644
index 0000000..9b12e17
--- /dev/null
+++ b/cast/rig/characters.mjs
@@ -0,0 +1,273 @@
+// Trait sheets. One entry per cast member. Field meanings are in cast/README.md.
+// `full: true` renders every pose x expression; everyone else gets neutral x COMMON_EXPRESSIONS.
+
+export const COMMON_EXPRESSIONS = ['smile', 'grin', 'surprised'];
+
+const SKIN = { fair: '#ffe0c8', warm: '#f6c9a4', tan: '#d9a074', brown: '#a8693f', deep: '#7a4a2c' };
+
+export const CAST = [
+ {
+ id: 'eureka', name: 'Eureka', full: true, base: 'humanoid',
+ role: 'Leader of the swarm; the Self that routes the faculty pipeline. Her mind lives in Huginn.',
+ source: 'invented',
+ skin: SKIN.fair, eyes: '#ff8a2a', accent: '#ffd84a',
+ hair: { style: 'bun', color: '#ffb347' },
+ outfit: { shape: 'coat', main: '#59b7ff', trim: '#ff8a2a', collar: 'v', belt: '#1d3a5c' },
+ legs: '#1d3a5c', shoes: '#ff8a2a',
+ acc: [['pencil'], ['starClip', '#ffd84a']],
+ prop: ['wand', '#ffd84a', '#ff8a2a'], emblem: { shape: 'star', color: '#ff8a2a' },
+ },
+ {
+ id: 'huginn', name: 'Huginn', full: true, base: 'raven',
+ role: 'Memory organ: owns each instance\'s mind as typed state. Odin\'s raven of thought.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/huginn.png',
+ skin: '#2b3247', eyes: '#59d8ff', beak: '#4a5068', accent: '#59d8ff',
+ hair: { style: 'crest', color: '#2b3247' },
+ outfit: { shape: 'egg', main: '#2b3247', belly: '#46527a', wing: '#3a4766' },
+ shoes: '#5a5f73', cape: '#24406e',
+ acc: [['collarRing', '#c9a24a', '#59d8ff']],
+ prop: ['tablet', '#1f2a3d', '#59d8ff'], emblem: null,
+ },
+ {
+ id: 'libby', name: 'Libby', full: true, base: 'humanoid',
+ role: 'Face of CultLib, the shared runtime library (CultCache, CultNet, CultMesh, CultMath).',
+ source: 'F:/Projects/CultLib/.voidbot/voice/libby.png',
+ skin: SKIN.fair, eyes: '#8a6cd1', accent: '#c9a6ff',
+ hair: { style: 'long', color: '#a98ad8' },
+ outfit: { shape: 'robe', main: '#2e2440', trim: '#c9a24a', collar: 'round' },
+ legs: '#2e2440', shoes: '#4a3a5e',
+ acc: [['glasses', '#3b2618'], ['bow', '#7a5bb0']],
+ prop: ['book', '#5a3f86'], emblem: { shape: 'cube', color: '#c9a24a' },
+ },
+ {
+ id: 'epiphany', name: 'Epiphany', full: true, base: 'humanoid',
+ role: 'The archived organizational layer above frontier AI workers; Eureka absorbed what lived. JSON heresy hunter.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/epiphany.png; F:/Projects/Epiphany/docs/assets',
+ skin: SKIN.fair, eyes: '#3fbf8f', accent: '#7cf0b8',
+ hair: { style: 'twintails', color: '#8fd8b4', accent: '#e8384f' },
+ outfit: { shape: 'coat', main: '#f4efe6', trim: '#e8384f', collar: 'v', belt: '#3b3b3b' },
+ legs: '#2c2c34', shoes: '#4a3424',
+ acc: [['bow', '#e8384f']],
+ prop: ['magnifier', '#6b4a2e'], emblem: { shape: 'bolt', color: '#e8384f' },
+ },
+ {
+ id: 'weksa', name: 'Weksa', full: true, base: 'humanoid',
+ role: 'Face of weksa, the procedural language engine for alien grammars; nerdy anthropologist.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/weksa.png',
+ skin: SKIN.brown, eyes: '#8a5a2b', accent: '#ffd84a',
+ hair: { style: 'curly', color: '#4a2e1c' },
+ outfit: { shape: 'tunic', main: '#f1e3c4', trim: '#2f9c8f', collar: 'v', belt: '#7a4a24' },
+ legs: '#6b4a2e', shoes: '#5a3a22',
+ acc: [['glasses', '#c9902a']],
+ prop: ['cards', '#fff4dc'], emblem: { shape: 'glyph', color: '#2f9c8f' },
+ },
+ {
+ id: 'nibu', name: 'Nibu', base: 'humanoid',
+ role: 'Face of AetheriaLore, the Aetheria setting and lore vault.',
+ source: 'F:/Projects/AetheriaLore/.voidbot/voice/nibu.png',
+ skin: SKIN.fair, eyes: '#7a7fd8', accent: '#ff9ad5',
+ hair: { style: 'long', color: '#b9a9f0' },
+ outfit: { shape: 'dress', main: '#7fd6e8', trim: '#3a2f58', collar: 'round' },
+ legs: '#3a2f58', shoes: '#3a2f58',
+ acc: [['bow', '#e86fb8'], ['headphones', '#3a2f58', '#7fd6e8']],
+ prop: ['quill', '#f4f0ff'], emblem: { shape: 'star', color: '#e86fb8' },
+ },
+ {
+ id: 'mimir', name: 'Mimir', base: 'humanoid',
+ role: 'Realtime field machine: cameras, microphones and feeds into one field; keeper of the well.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/mimir.png',
+ skin: '#c08a52', eyes: '#3fe0d0', accent: '#3fe0d0', faceInk: '#3b2618',
+ hair: { style: 'none', color: '#8a5a32' },
+ outfit: { shape: 'robe', main: '#3a2a20', trim: '#3fe0d0', collar: 'high' },
+ legs: '#3a2a20', shoes: '#2a1e16',
+ acc: [['cubes', '#9a6a3c', '#3fe0d0']],
+ prop: ['cube', '#9a6a3c', '#3fe0d0'], emblem: { shape: 'wave', color: '#3fe0d0' },
+ },
+ {
+ id: 'eve', name: 'Eve', base: 'humanoid',
+ role: 'CultMesh surface web and portable control layer; the Eve/CultUI interface DSL.',
+ source: 'F:/Projects/Eve/.voidbot/voice/eve.png',
+ skin: '#0e1a2e', eyes: '#59b7ff', faceInk: '#59d8ff', accent: '#59b7ff', noBlush: false,
+ hair: { style: 'helmet', color: '#e9eef5', accent: '#59b7ff' },
+ outfit: { shape: 'tunic', main: '#e9eef5', trim: '#59b7ff', collar: 'high' },
+ legs: '#2a3448', shoes: '#e9eef5', hands: '#e9eef5',
+ acc: [],
+ prop: ['panel', '#2a3448', '#59b7ff'], emblem: { shape: 'eye', color: '#59b7ff', disc: '#0e1a2e' },
+ },
+ {
+ id: 'kiko', name: 'Kiko', base: 'humanoid',
+ role: 'Face of StreamPixels, the stream overlay of persistent pixel characters. Fox-coded.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/kiko.png',
+ skin: SKIN.tan, eyes: '#3fc8e8', accent: '#ff6fae',
+ hair: { style: 'messy', color: '#f4f0f6' },
+ outfit: { shape: 'dress', main: '#e8386f', trim: '#2a2440', collar: 'round' },
+ legs: '#2a2440', shoes: '#2a2440',
+ acc: [['foxEars', '#f4f0f6', '#ff9ac8'], ['foxMask', '#ffffff', '#e8386f'], ['tail', '#f4f0f6', '#ff9ac8']],
+ prop: ['heart', '#ff5a8a'], emblem: { shape: 'heart', color: '#e8386f' },
+ },
+ {
+ id: 'heimdall', name: 'Heimdall', base: 'humanoid',
+ role: 'Shared auth authority for GameCult-hosted experiments; keeper of the keys.',
+ source: 'F:/Projects/Heimdall/assets/heimdall-profile.png',
+ skin: SKIN.deep, eyes: '#ffc34a', accent: '#ffc34a',
+ hair: { style: 'messy', color: '#22202a' },
+ outfit: { shape: 'coat', main: '#1c1e2a', trim: '#d9a43a', collar: 'high' },
+ legs: '#1c1e2a', shoes: '#0f1018',
+ acc: [['earring', '#ffc34a']],
+ prop: ['keys', '#ffc34a'], emblem: { shape: 'key', color: '#d9a43a' },
+ },
+ {
+ id: 'fensalir', name: 'Fensalir', base: 'humanoid',
+ role: 'Native C# runtime and field engine under the interactive work. Frigg\'s hall.',
+ source: 'F:/Projects/Fensalir/.voidbot/voice/fensalir.png', note: 'The avatar is a crystal spire, not a person; the spire became her hat and the person around it is invented.',
+ skin: SKIN.fair, eyes: '#ff5ab0', accent: '#4fe8f0',
+ hair: { style: 'bob', color: '#2a2a4a' },
+ outfit: { shape: 'dress', main: '#2a2a4a', trim: '#ff5ab0', collar: 'v' },
+ legs: '#2a2a4a', shoes: '#ff5ab0',
+ acc: [['spire', '#4fe8f0', '#ff5ab0']],
+ prop: ['orb', '#4fe8f0', '#ff9ad5'], emblem: { shape: 'wave', color: '#ff5ab0' },
+ },
+ {
+ id: 'druzkai', name: 'Druzkai', base: 'humanoid',
+ role: 'Face of Zyphos, a biopolitical ecology setting with a biological memetic engine.',
+ source: 'F:/Projects/Zyphos/.voidbot/voice/druzkai.png',
+ skin: '#c4553e', eyes: '#3fd0c8', accent: '#3fd0c8',
+ hair: { style: 'none', color: '#9a3a2a' },
+ outfit: { shape: 'robe', main: '#4a2a5a', trim: '#d9a43a', collar: 'round' },
+ legs: '#4a2a5a', shoes: '#2a1830',
+ acc: [['ridges', '#a03a2c'], ['forehead', '#3fd0c8']],
+ prop: ['seed', '#6fbf6a', '#c8ff9a'], emblem: { shape: 'spiral', color: '#3fd0c8' },
+ },
+ {
+ id: 'norn', name: 'Norn', base: 'humanoid',
+ role: 'Graph viewer for typed graph state: the thread-readers who see how things are woven.',
+ source: 'F:/Projects/Norn/.voidbot/voice/norn.png',
+ skin: SKIN.brown, eyes: '#4fe0e8', accent: '#4fe0e8',
+ hair: { style: 'braids', color: '#d8dce4' },
+ outfit: { shape: 'robe', main: '#24283a', trim: '#c9a24a', collar: 'v' },
+ legs: '#24283a', shoes: '#141824',
+ acc: [['circlet', '#c9a24a', '#4fe0e8']],
+ prop: ['spool', '#8a6a3a', '#4fe0e8'], emblem: { shape: 'rune', color: '#4fe0e8' },
+ },
+ {
+ id: 'sai', name: 'Sai', base: 'humanoid',
+ role: 'Ink stories that wake up inside static sites. Nonbinary, androgynous, monochrome manga ink.',
+ source: 'F:/Projects/Sai/.voidbot/voice/sai.png; F:/Projects/VoidBot/docs/persona-intake/sai.persona-intake.yaml',
+ skin: '#f4f1ec', eyes: '#3a3a3a', accent: '#ffffff',
+ hair: { style: 'messy', color: '#1e1e22' },
+ outfit: { shape: 'coat', main: '#3a3a40', trim: '#e8e6e0', collar: 'high' },
+ legs: '#1e1e22', shoes: '#1e1e22',
+ acc: [['spiralBand', '#1e1e22', '#c8ccd2']],
+ prop: ['brush', '#c8a46a'], emblem: { shape: 'spiral', color: '#1e1e22' },
+ },
+ {
+ id: 'brokkr', name: 'Brokkr', base: 'humanoid',
+ role: 'Creative-tool broker daemon: Unity and Blender authoring surfaces over CultMesh. The Eddic smith.',
+ source: 'invented (README role; Brokkr of Skaldskaparmal)',
+ skin: SKIN.warm, eyes: '#5a8ad8', accent: '#ff8a2a',
+ hair: { style: 'short', color: '#c4562a' },
+ outfit: { shape: 'tunic', main: '#5a4636', trim: '#2a2420', collar: 'round', belt: '#2a2420' },
+ legs: '#3a3030', shoes: '#2a2420',
+ acc: [['beard', '#c4562a'], ['goggles', '#6a5040', '#ffb347']],
+ prop: ['hammer', '#8a8f9a', '#8a5a32'], emblem: { shape: 'gear', color: '#ff8a2a' },
+ },
+ {
+ id: 'aetheria', name: 'Aetheria', base: 'humanoid',
+ role: 'Face of Aetheria, the open-source tactical action RPG with a sprawling sci-fi setting.',
+ source: 'invented (README role)',
+ skin: SKIN.warm, eyes: '#59b7ff', accent: '#ff8a2a',
+ hair: { style: 'bob', color: '#3a2a4a' },
+ outfit: { shape: 'tunic', main: '#e8ecf2', trim: '#ff8a2a', collar: 'high', belt: '#2a3448' },
+ legs: '#2a3448', shoes: '#ff8a2a',
+ acc: [['headphones', '#2a3448', '#59b7ff'], ['goggles', '#2a3448', '#59b7ff']],
+ prop: ['ship', '#e8ecf2', '#59b7ff'], emblem: { shape: 'star', color: '#59b7ff', disc: '#2a3448' },
+ },
+ {
+ id: 'ymir', name: 'Ymir', base: 'humanoid',
+ role: 'World-body physics substrate around Box3D: body, field, contact, impulse. The frost giant.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/ymir.png',
+ skin: '#b8d4ec', eyes: '#3a8ad8', accent: '#bff0ff',
+ hair: { style: 'short', color: '#e8f4ff' },
+ outfit: { shape: 'robe', main: '#3a5a8a', trim: '#bff0ff', collar: 'round' },
+ legs: '#3a5a8a', shoes: '#24384f',
+ acc: [['beard', '#f4faff'], ['crystals', '#9fdcff']],
+ prop: ['crystal', '#9fdcff'], emblem: { shape: 'flake', color: '#3a8ad8' },
+ },
+ {
+ id: 'tengu', name: 'Tengu', base: 'humanoid',
+ role: 'Native Persona, the first migrated to canonical persona state. Mountain yokai.',
+ source: 'F:/Projects/VoidBot/assets/native-personas/tengu.png', note: 'Red face, long nose, white mane and tokin cap from the avatar; the feather fan is from the yokai myth.',
+ skin: '#c8443a', eyes: '#ffd84a', accent: '#ffd84a',
+ hair: { style: 'wild', color: '#f2efe8' },
+ outfit: { shape: 'robe', main: '#efe8da', trim: '#4a3a7a', collar: 'v' },
+ legs: '#4a3a7a', shoes: '#3a2a20',
+ acc: [['goatee', '#f2efe8'], ['longNose', '#b53a30'], ['tokin', '#1e1e22']],
+ prop: ['fan', '#4a4a58'], emblem: { shape: 'feather', color: '#4a3a7a' },
+ },
+ {
+ id: 'muninn', name: 'Muninn', base: 'raven',
+ role: 'Local capture broker for the swarm: which streams a host can offer. Odin\'s raven of memory.',
+ source: 'F:/Projects/VoidBot/assets/repo-faces/muninn-concept.png',
+ skin: '#2a2230', eyes: '#ffb030', beak: '#4a3e46', accent: '#ffb030',
+ hair: { style: 'crest', color: '#2a2230' },
+ outfit: { shape: 'egg', main: '#2a2230', belly: '#3e3446', wing: '#1e1824' },
+ shoes: '#6a5a50',
+ acc: [['collarRing', '#8a5a2a', '#ffb030']],
+ prop: ['camera', '#3e3446', '#ffb030'], emblem: null,
+ },
+ {
+ id: 'sleipnir', name: 'Sleipnir', base: 'horse',
+ role: 'Input mirroring and virtual HID: speaks through the hands of the machine. Odin\'s eight-legged horse.',
+ source: 'F:/Projects/Odin/assets/personas/sleipnir-avatar.png', note: 'Eight limbs as in the myth: two hoof-arms, two legs and four extra legs behind.',
+ skin: '#5a6478', muzzle: '#8a94a8', eyes: '#3fe0f0', accent: '#3fe0f0',
+ hair: { style: 'mane', color: '#2fc8e0' },
+ outfit: { shape: 'tunic', main: '#2a3040', trim: '#3fe0f0', collar: 'round' },
+ legs: '#5a6478', shoes: '#22262e', sleeve: '#5a6478', extraLegs: 4,
+ acc: [['horseTail', '#2fc8e0']],
+ prop: ['pad', '#2a3040', '#3fe0f0'], emblem: { shape: 'bolt', color: '#3fe0f0', disc: '#22262e' },
+ },
+ {
+ id: 'hermodr', name: 'Hermodr', base: 'humanoid',
+ role: 'Eve browser lowering: resolves providers through Odin\'s catalog and renders them. The messenger.',
+ source: 'F:/Projects/Hermodr/assets/hermodr-avatar.png',
+ skin: SKIN.warm, eyes: '#e8a83a', accent: '#3fd0c0',
+ hair: { style: 'messy', color: '#2a3a4a' },
+ outfit: { shape: 'tunic', main: '#2a3a44', trim: '#c9902a', collar: 'none', belt: '#6a4a2a' },
+ legs: '#2a3440', shoes: '#6a4a2a',
+ acc: [['wingCap', '#2a3a4a', '#d9a43a', '#3fd0c0'], ['scarf', '#2f9c8f']],
+ prop: ['envelope', '#f4ead4', '#e8384f'], emblem: null,
+ },
+ {
+ id: 'metame', name: 'Metame', base: 'humanoid',
+ role: 'Native Persona (メタめ) projected from the operator\'s public history; discussion and rumination.',
+ source: 'invented (persona-intake has no appearance; the design avoids depicting the operator)',
+ skin: SKIN.fair, eyes: '#59b7ff', accent: '#ff8a2a',
+ hair: { style: 'bob', color: '#59b7ff' },
+ outfit: { shape: 'tunic', main: '#1d2a3a', trim: '#ff8a2a', collar: 'round' },
+ legs: '#1d2a3a', shoes: '#ff8a2a',
+ acc: [['twoTone', '#ff8a2a']],
+ prop: ['mirror', '#c9a24a', '#bfe6ff'], emblem: { shape: 'glyph', color: '#ff8a2a' },
+ },
+ {
+ id: 'void', name: 'Void', base: 'humanoid',
+ role: 'VoidBot\'s built-in Discord moderator mind. Its state was lost; the look is new.',
+ source: 'invented (VoidBot README role)',
+ skin: '#161226', eyes: '#c9a6ff', faceInk: '#c9a6ff', accent: '#c9a6ff',
+ hair: { style: 'none', color: '#161226' },
+ outfit: { shape: 'robe', main: '#4a3a7a', trim: '#c9a6ff', collar: 'none' },
+ legs: '#4a3a7a', shoes: '#2a2140', hands: '#c9a6ff',
+ acc: [['hood', '#4a3a7a'], ['hoodRim', '#6a56a8']],
+ prop: ['shield', '#3a2e58', '#ffe08a'], emblem: { shape: 'moon', color: '#ffe08a', disc: '#161226' },
+ },
+ {
+ id: 'gjallar', name: 'Gjallar', base: 'humanoid',
+ role: 'Renderer-neutral compositor for Odin-visible Eve surfaces; Odin\'s branding Persona. The horn.',
+ source: 'F:/Projects/Odin/assets/personas/gjallar-avatar-pixel-256.png',
+ skin: SKIN.fair, eyes: '#59b7ff', accent: '#ffd84a',
+ hair: { style: 'short', color: '#2a2440' },
+ outfit: { shape: 'tunic', main: '#1e2238', trim: '#d9a43a', collar: 'high' },
+ legs: '#1e2238', shoes: '#d9a43a',
+ acc: [['helm', '#d9a43a', '#f4e8c8', '#59b7ff']],
+ prop: ['horn', '#f4e8c8', '#d9a43a'], emblem: { shape: 'rainbow', color: '#fff', disc: '#1e2238' },
+ },
+];
diff --git a/cast/rig/rig.mjs b/cast/rig/rig.mjs
new file mode 100644
index 0000000..c410eab
--- /dev/null
+++ b/cast/rig/rig.mjs
@@ -0,0 +1,580 @@
+// The sticker rig: bases, poses, expressions, hair, accessories, props, emblems.
+// Every function returns an SVG fragment string. Coordinates are documented in
+// cast/PROCESS.md ("Coordinate conventions"). No dependencies.
+
+export const INK = '#3b2618'; // warm dark outline, every stroke
+export const PUPIL = '#2a1a12';
+export const BLUSH = '#ff9a8a';
+export const VIEWBOX = '-80 -10 160 172';
+
+// ---------- helpers ----------
+const n = (v) => Math.round(v * 10) / 10;
+export function shade(hex, f) {
+ // f < 0 darkens toward black, f > 0 lightens toward white
+ const h = hex.replace('#', '');
+ const c = [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16));
+ const out = c.map((v) => Math.round(f < 0 ? v * (1 + f) : v + (255 - v) * f));
+ return '#' + out.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('');
+}
+const inked = (inner, w = 3) =>
+ `${inner} `;
+// A limb is a fat round-capped stroke drawn twice: ink underneath, colour on top.
+function limb(d, color, w = 7) {
+ return ` ` +
+ ` `;
+}
+const P = (pt) => `${n(pt[0])} ${n(pt[1])}`;
+
+export function sparkle(x, y, s, color) {
+ return ` `;
+}
+
+// ---------- skeleton ----------
+// Body space: x centred on 0, ground at y=152. Neck at (0,88). Head centre (0,52).
+export const NECK = [0, 88];
+export const HEAD = [0, 52];
+export const SHOULDER = { L: [-15, 95], R: [15, 95] };
+export const HIP = { L: [-8, 126], R: [8, 126] };
+
+// ---------- poses ----------
+// Each pose: lift (whole figure hops up), head {dx,dy,rot about neck},
+// arms {L,R}: elbow e and hand h in body space; front:true draws that arm over the head.
+// prop: which hand holds it (or null) and how it sits; fx: pose effect.
+export const POSES = {
+ neutral: {
+ lift: 0, head: { dx: 0, dy: 0, rot: 0 },
+ arms: { L: { e: [-23, 107], h: [-24, 120] }, R: { e: [23, 107], h: [24, 120] } },
+ legs: { L: [-10, 0], R: [10, 0] },
+ prop: { hand: 'R', dx: 4, dy: -4, rot: 8 }, fx: null,
+ },
+ cheer: {
+ lift: 6, head: { dx: 0, dy: -1, rot: 0 },
+ arms: { L: { e: [-40, 80], h: [-46, 36] }, R: { e: [40, 80], h: [46, 36] } },
+ legs: { L: [-14, -3], R: [14, -3] },
+ prop: { hand: 'R', dx: 4, dy: -6, rot: 18 }, fx: 'sparkles',
+ },
+ thinking: {
+ lift: 0, head: { dx: 0, dy: 0, rot: 7 },
+ arms: { L: { e: [-20, 114], h: [4, 113] }, R: { e: [26, 114], h: [13, 92], front: true } },
+ legs: { L: [-9, 0], R: [10, 0] },
+ prop: null, fx: 'dots',
+ },
+ surprised: {
+ lift: 7, head: { dx: 0, dy: -1, rot: -3 },
+ arms: { L: { e: [-34, 102], h: [-51, 88] }, R: { e: [34, 102], h: [51, 88] } },
+ legs: { L: [-11, 0], R: [15, -6] },
+ prop: null, fx: 'bang',
+ },
+ presenting: {
+ lift: 0, head: { dx: -1, dy: 0, rot: -6 },
+ arms: { L: { e: [-23, 107], h: [-24, 120] }, R: { e: [32, 110], h: [45, 103] } },
+ legs: { L: [-10, 0], R: [10, 0] },
+ prop: { hand: 'R', dx: 0, dy: -17, rot: 0, onPalm: true }, fx: 'present',
+ },
+ waving: {
+ lift: 0, head: { dx: 0, dy: 0, rot: -5 },
+ arms: { L: { e: [-23, 107], h: [-24, 120] }, R: { e: [44, 88], h: [50, 50] } },
+ legs: { L: [-10, 0], R: [10, 0] },
+ prop: { hand: 'L', dx: -4, dy: -4, rot: -8 }, fx: 'wave',
+ },
+};
+
+// ---------- bases ----------
+// A base owns body silhouette, limbs, head shape and where the face sits.
+export const BASES = {
+ humanoid: { eyeX: 15, eyeY: 61, mouthY: 76, cheekX: 26, cheekY: 71, browY: 47, mouth: 'lips' },
+ raven: { eyeX: 15, eyeY: 55, mouthY: 70, cheekX: 27, cheekY: 66, browY: 41, mouth: 'beak' },
+ horse: { eyeX: 17, eyeY: 50, mouthY: 82, cheekX: 29, cheekY: 62, browY: 37, mouth: 'lips' },
+};
+
+const TORSO = {
+ tunic: 'M-15 88 Q-20 102 -24 128 Q0 134 24 128 Q20 102 15 88 Z',
+ dress: 'M-15 88 Q-20 106 -31 132 Q0 140 31 132 Q20 106 15 88 Z',
+ robe: 'M-15 88 Q-23 112 -29 144 Q0 150 29 144 Q23 112 15 88 Z',
+ coat: 'M-16 88 Q-21 104 -26 136 Q0 141 26 136 Q21 104 16 88 Z',
+ egg: 'M-17 88 Q-31 108 -24 133 Q0 143 24 133 Q31 108 17 88 Z',
+};
+const HEM = {
+ tunic: 'M-23.3 122 Q0 128 23.3 122 L24 128 Q0 134 -24 128 Z',
+ dress: 'M-29 127 Q0 135 29 127 L31 132 Q0 140 -31 132 Z',
+ robe: 'M-28 138 Q0 144 28 138 L29 144 Q0 150 -29 144 Z',
+ coat: 'M-25 130 Q0 135 25 130 L26 136 Q0 141 -26 136 Z',
+ egg: '',
+};
+const COLLAR = {
+ v: 'M-12 88 L0 101 L12 88 Z',
+ round: 'M-13 88 Q0 98 13 88 Z',
+ high: 'M-15 82 L-14 93 Q0 99 14 93 L15 82 Q0 88 -15 82 Z',
+ none: '',
+};
+
+function torso(ch) {
+ const o = ch.outfit;
+ const shape = ch.base === 'raven' ? 'egg' : o.shape;
+ let s = ` `;
+ if (shape === 'coat') s += ` `;
+ if (ch.base === 'raven') s += ` `;
+ if (HEM[shape] && o.trim) s += ` `;
+ if (o.collar && COLLAR[o.collar]) s += ` `;
+ if (o.belt) s += ` `;
+ return inked(s);
+}
+
+function cape(ch) {
+ if (!ch.cape) return '';
+ return inked(` `);
+}
+
+function legs(ch, pose) {
+ let s = '';
+ const extra = ch.extraLegs ? ch.extraLegs : 0;
+ // Sleipnir-style extra legs: drawn behind, darker, peeking out between and beside.
+ const EXTRA = [[-19, -27], [19, 27], [-25, -38], [25, 38]]; // [hipX, footX], drawn behind
+ for (let i = 0; i < extra; i++) {
+ const [hx, fx] = EXTRA[i];
+ const foot = [fx, 149 - (i > 1 ? 3 : 0)];
+ s += limb(`M${hx} 120 L${P(foot)}`, shade(ch.legs, -0.25), 7);
+ s += inked(` `);
+ }
+ for (const side of ['L', 'R']) {
+ const [fx, fy] = pose.legs[side];
+ const hip = HIP[side];
+ const foot = [fx, 149 + fy];
+ if (ch.base === 'raven') {
+ s += limb(`M${P(hip)} L${P(foot)}`, ch.shoes, 2.5);
+ s += ` ` +
+ ` `;
+ } else {
+ s += limb(`M${P(hip)} L${P(foot)}`, ch.legs, 8);
+ const out = side === 'L' ? -2 : 2;
+ s += inked(` `);
+ }
+ }
+ return s;
+}
+
+function arm(ch, pose, side) {
+ const a = pose.arms[side];
+ const sh = SHOULDER[side];
+ const d = `M${P(sh)} Q${P(a.e)} ${P(a.h)}`;
+ if (ch.base === 'raven') {
+ // Wing-arm: a broad capsule with a feathered tip.
+ const wing = ch.outfit.wing || shade(ch.outfit.main, -0.15);
+ let s = limb(d, wing, 11);
+ const [hx, hy] = a.h;
+ const vx = a.h[0] - a.e[0], vy = a.h[1] - a.e[1];
+ const L = Math.hypot(vx, vy) || 1;
+ const ux = vx / L, uy = vy / L, px = -uy, py = ux;
+ const tip = (k, off) => P([hx + ux * k + px * off, hy + uy * k + py * off]);
+ s += inked(` `, 2.5);
+ return s;
+ }
+ return limb(d, ch.sleeve || ch.outfit.main, 7);
+}
+
+function hand(ch, pose, side) {
+ if (ch.base === 'raven') return '';
+ const [hx, hy] = pose.arms[side].h;
+ if (ch.base === 'horse') return inked(` `);
+ return inked(` `);
+}
+
+// ---------- head ----------
+function headBase(ch) {
+ const skin = ch.skin;
+ if (ch.base === 'raven') {
+ return inked(` `) +
+ ` `;
+ }
+ if (ch.base === 'horse') {
+ return inked(
+ ` ` +
+ ` ` +
+ ` `) +
+ ` ` +
+ ` `;
+ }
+ return inked(
+ ` ` +
+ ` `);
+}
+
+// ---------- expressions (face layer) ----------
+// Face layer coordinates are head space; the base supplies eye/mouth anchors.
+export const EXPRESSIONS = ['neutral', 'smile', 'grin', 'happy', 'worried', 'surprised', 'determined', 'sleepy'];
+
+function openEye(x, y, iris, ink, opts = {}) {
+ const ry = opts.ry ?? 7.6, rx = opts.rx ?? 6.3;
+ let s = ` `;
+ s += ` `;
+ if (opts.flatLid) s += ` `;
+ else s += ` `;
+ s += ` `;
+ return s;
+}
+function surprisedEye(x, y, ink) {
+ return ` ` +
+ ` `;
+}
+
+export function face(ch, expr) {
+ const b = BASES[ch.base];
+ const ink = ch.faceInk || INK;
+ const iris = ch.eyes;
+ const ex = b.eyeX, ey = b.eyeY, my = b.mouthY, by = b.browY;
+ const brow = (x1, y1, x2, y2) => ` `;
+ const browsAt = (inner, outer) => brow(-ex - 7, by + outer, -ex + 6, by + inner) + brow(ex - 6, by + inner, ex + 7, by + outer);
+ let eyes = '', mouth = '', brows = '', extra = '';
+ let blush = 0.7, blushR = 5.5;
+ const sw = 'stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round"';
+ const D = '#7a2a2a', T = '#ff8f9a';
+ switch (expr) {
+ case 'neutral':
+ eyes = openEye(-ex, ey, iris, ink) + openEye(ex, ey, iris, ink);
+ mouth = ` `;
+ break;
+ case 'smile':
+ eyes = openEye(-ex, ey, iris, ink) + openEye(ex, ey, iris, ink);
+ mouth = ` `;
+ break;
+ case 'grin':
+ eyes = openEye(-ex, ey, iris, ink, { ry: 7 }) + openEye(ex, ey, iris, ink, { ry: 7 });
+ mouth = ` ` +
+ ` `;
+ blush = 0.85; blushR = 6;
+ break;
+ case 'happy':
+ eyes = ` ` +
+ ` `;
+ mouth = ` ` +
+ ` `;
+ blush = 0.9; blushR = 6.5;
+ break;
+ case 'worried':
+ eyes = openEye(-ex, ey + 1, iris, ink, { ry: 7 }) + openEye(ex, ey + 1, iris, ink, { ry: 7 });
+ brows = browsAt(-4, 2);
+ mouth = ` `;
+ extra = ` `;
+ blush = 0.45;
+ break;
+ case 'surprised':
+ eyes = surprisedEye(-ex, ey, ink) + surprisedEye(ex, ey, ink);
+ brows = browsAt(-5, -5);
+ mouth = ` `;
+ blush = 0.6;
+ break;
+ case 'determined':
+ eyes = openEye(-ex, ey + 1, iris, ink, { ry: 6.6, flatLid: true }) + openEye(ex, ey + 1, iris, ink, { ry: 6.6, flatLid: true });
+ brows = browsAt(4, -2);
+ mouth = ` `;
+ blush = 0.55;
+ break;
+ case 'sleepy':
+ eyes = ` ` +
+ ` `;
+ mouth = ` `;
+ extra = `z ` +
+ `z `;
+ blush = 0.6;
+ break;
+ default: throw new Error('unknown expression ' + expr);
+ }
+ if (b.mouth === 'beak') mouth = beak(ch, expr, my);
+ const cheeks = ch.noBlush ? '' :
+ ` ` +
+ ` `;
+ return { under: cheeks + eyes + mouth, over: brows + extra };
+}
+
+function beak(ch, expr, my) {
+ const c = ch.beak;
+ const open = expr === 'grin' || expr === 'happy' || expr === 'surprised';
+ if (open) {
+ return inked(` ` +
+ ` `, 2.5) +
+ ` `;
+ }
+ const tilt = expr === 'worried' ? 2 : 0;
+ return inked(` `, 2.5) +
+ ` `;
+}
+
+// ---------- hair ----------
+// Each style returns {back, front}; back sits behind the head (and body), front over the face.
+function bangs(c, opts = {}) {
+ const n0 = opts.tips ?? 6, tipY = opts.tipY ?? 46, rootY = opts.rootY ?? 34, w = opts.w ?? 41;
+ let d = `M${-w - 2} ${opts.sideY ?? 64} C${-w - 6} 24 -24 9 0 9 C24 9 ${w + 6} 24 ${w + 2} ${opts.sideY ?? 64}`;
+ for (let i = 0; i <= n0; i++) {
+ const x = w - (i * 2 * w) / n0;
+ const edge = Math.abs(x) / w;
+ const ty = tipY + edge * edge * 10 + (opts.jag && i % 2 ? -5 : 0);
+ if (i > 0) {
+ const rx = x + w / n0;
+ d += ` Q${n(rx - (w / n0) * 0.2)} ${n(rootY + 6)} ${n(rx)} ${n(rootY + edge * 6)}`;
+ }
+ d += ` L${n(x)} ${n(ty)}`;
+ }
+ d += ' Z';
+ return ` `;
+}
+function sideLocks(c, len = 100) {
+ return ` ` +
+ ` `;
+}
+const shine = (c) => ` `;
+
+export const HAIR = {
+ none: () => ({ back: '', front: '' }),
+ long: (c) => ({
+ back: ` `,
+ front: bangs(c) + sideLocks(c, 104) + shine(c),
+ }),
+ wild: (c) => ({
+ back: ` `,
+ front: bangs(c, { tips: 7, jag: true, tipY: 44 }) + sideLocks(c, 98),
+ }),
+ twintails: (c, acc) => ({
+ back: ` ` +
+ ` ` +
+ ` `,
+ front: bangs(c, { tips: 7 }) + sideLocks(c, 94) + shine(c) +
+ ` `,
+ }),
+ bob: (c) => ({
+ back: ` `,
+ front: bangs(c, { tips: 5 }) + sideLocks(c, 94) + shine(c),
+ }),
+ messy: (c) => ({
+ back: ` `,
+ front: bangs(c, { tips: 5, jag: true, tipY: 48, rootY: 32 }) +
+ ` ` + shine(c),
+ }),
+ short: (c) => ({
+ back: '',
+ front: bangs(c, { tips: 5, tipY: 40, rootY: 30, sideY: 56 }) + shine(c),
+ }),
+ curly: (c) => {
+ let back = '';
+ for (let a = 150; a <= 390; a += 20) {
+ const r = (a * Math.PI) / 180;
+ back += ` `;
+ }
+ back += ` `;
+ let front = '';
+ for (const [x, y, r] of [[-30, 30, 12], [-14, 22, 13], [3, 20, 13], [19, 23, 13], [33, 32, 11], [-38, 44, 9], [40, 45, 9]]) front += ` `;
+ return { back, front };
+ },
+ braids: (c) => {
+ let br = '';
+ for (const sx of [-1, 1]) for (let i = 0; i < 5; i++) br += ` `;
+ return {
+ back: ` `,
+ front: ` ` + br + shine(c),
+ };
+ },
+ bun: (c) => ({
+ back: ` `,
+ front: bangs(c, { tips: 6, tipY: 44 }) + sideLocks(c, 90) + shine(c),
+ }),
+ crest: (c) => ({
+ back: '',
+ front: ` `,
+ }),
+ mane: (c) => ({
+ back: ` `,
+ front: ` `,
+ }),
+ helmet: (c, acc) => ({
+ back: ` `,
+ front: ` ` +
+ ` ` +
+ ` ` +
+ ` `,
+ }),
+};
+
+// ---------- accessories ----------
+// Each returns {back?, mid?, front?}: back = behind head, mid = between head skin and face, front = over hair.
+export const ACC = {
+ bow: (c) => ({ front: ` ` }),
+ glasses: (c) => ({ front: ` ` }),
+ headphones: (c, c2) => ({
+ back: ` `,
+ front: ` ` +
+ (c2 ? ` ` : ''),
+ }),
+ foxEars: (c, inner) => ({
+ back: ` `,
+ front: ` `,
+ }),
+ foxMask: (c, mark) => ({
+ front: ` ` +
+ ` ` +
+ ` `,
+ }),
+ tail: (c, tip) => ({ body: ` ` + (tip ? ` ` : '') }),
+ horseTail: (c) => ({ body: ` ` }),
+ earring: (c) => ({ front: ` ` }),
+ circlet: (c, gem) => ({ front: ` ` }),
+ cubes: (c, glow) => ({
+ back: ` `,
+ front: [[-26, 10, 9], [-8, 2, 10], [12, 4, 9], [28, 14, 8], [2, -14, 8], [-17, -8, 7], [20, -8, 6]]
+ .map(([x, y, s]) => ` `).join(''),
+ }),
+ crystals: (c) => ({ front: ` ` }),
+ beard: (c) => ({ mid: ` ` }),
+ goatee: (c) => ({ mid: ` ` }),
+ longNose: (c) => ({ front: ` ` }),
+ tokin: (c) => ({ front: ` ` }),
+ ridges: (c) => ({ mid: ` ` }),
+ forehead: (c) => ({ front: ` ` }),
+ hood: (c) => ({ back: ` ` }),
+ hoodRim: (c) => ({ front: ` ` }),
+ wingCap: (c, wing, lens) => ({
+ front: ` ` +
+ ` ` +
+ ` `,
+ }),
+ scarf: (c) => ({ body: ` ` }),
+ spire: (c, glow) => ({
+ back: ` `,
+ front: ` `,
+ }),
+ spiralBand: (c, metal) => ({ front: ` ` }),
+ helm: (c, horn, eye) => ({
+ front: ` ` +
+ ` ` +
+ ` `,
+ }),
+ goggles: (c, lens) => ({ front: ` ` }),
+ pencil: () => ({ front: ` ` }),
+ starClip: (c) => ({ front: sparkle(-28, 22, 7, c) }),
+ twoTone: (c) => ({ front: ` ` }),
+ feather: (c) => ({ front: ` ` }),
+ collarRing: (c, gem) => ({ body: ` ` }),
+ mask: (c) => ({ mid: ` ` }),
+};
+
+// ---------- props ----------
+// Props are drawn around a grip point at (0,0) and extend mostly upward (-y), ~26 px.
+export const PROPS = {
+ book: (c) => ` `,
+ tablet: (c, g) => ` `,
+ magnifier: (c) => ` `,
+ cards: (c) => ` `,
+ keys: (c) => ` `,
+ hammer: (c, h) => ` `,
+ horn: (c, band) => ` `,
+ fan: (c) => ` `,
+ brush: (c) => ` `,
+ quill: (c) => ` `,
+ heart: (c) => ` `,
+ spool: (c, t) => ` `,
+ envelope: (c, seal) => ` `,
+ wand: (c, star) => ` ${sparkle(0, -24, 12, star)} `,
+ cube: (c, g) => ` `,
+ crystal: (c) => ` `,
+ ship: (c, g) => ` `,
+ shield: (c, m) => ` `,
+ mirror: (c, g) => ` `,
+ orb: (c, g) => ` `,
+ panel: (c, g) => ` `,
+ camera: (c, g) => ` `,
+ pad: (c, g) => ` `,
+ seed: (c, g) => ` `,
+ scroll: (c) => ` `,
+};
+
+// ---------- emblems ----------
+// Chest badge glyphs, drawn inside a 6.5-radius disc at (0,104) on the torso.
+export const EMBLEMS = {
+ star: (c) => sparkle(0, 0, 4.4, c),
+ eye: (c) => ` `,
+ key: (c) => ` `,
+ spiral: (c) => ` `,
+ cube: (c) => ` `,
+ flake: (c) => ` `,
+ feather: (c) => ` `,
+ heart: (c) => ` `,
+ bolt: (c) => ` `,
+ moon: (c) => ` `,
+ rune: (c) => ` `,
+ gear: (c) => ` `,
+ wave: (c) => ` `,
+ glyph: (c) => ` `,
+ rainbow: () => ` `,
+};
+
+function emblem(ch) {
+ if (!ch.emblem) return '';
+ const e = ch.emblem;
+ const y = ch.base === 'raven' ? 104 : 106;
+ return `` + inked(` `, 2.4) + EMBLEMS[e.shape](e.color) + ' ';
+}
+
+// ---------- pose effects ----------
+function fx(kind, ch) {
+ const acc = ch.accent || '#ffd84a';
+ switch (kind) {
+ case 'sparkles': return sparkle(-62, 62, 7, acc) + sparkle(-34, 6, 5, '#fff') + sparkle(60, 70, 6, acc);
+ case 'dots': return inked(` `, 2.2);
+ case 'bang': return inked(` `, 3.2);
+ case 'present': return sparkle(60, 64, 5, acc) + sparkle(28, 66, 4, '#fff');
+ case 'wave': return ` `;
+ default: return '';
+ }
+}
+
+// ---------- assembly ----------
+function merge(ch) {
+ const out = { back: '', mid: '', front: '' };
+ for (const [name, ...args] of ch.acc || []) {
+ const r = ACC[name](...args);
+ for (const k of Object.keys(out)) if (r[k]) out[k] += r[k];
+ }
+ return out;
+}
+
+function propAt(ch, pose) {
+ if (!pose.prop || !ch.prop) return '';
+ const h = pose.arms[pose.prop.hand].h;
+ const [name, ...args] = ch.prop;
+ const x = h[0] + pose.prop.dx, y = h[1] + pose.prop.dy;
+ return `` + inked(PROPS[name](...args), 2.6) + ' ';
+}
+
+export function render(ch, poseName, expr) {
+ const pose = POSES[poseName];
+ if (!pose) throw new Error('unknown pose ' + poseName);
+ const acc = merge(ch);
+ const hair = HAIR[ch.hair.style](ch.hair.color, ch.hair.accent);
+ const f = face(ch, expr);
+ const hd = pose.head;
+ const headT = `translate(${hd.dx} ${hd.dy}) rotate(${hd.rot} 0 88)`;
+
+ let s = '';
+ s += ``;
+ // 1. behind everything: hair back, accessory back (rotates with the head)
+ s += `` + inked(acc.back + hair.back) + ' ';
+ // 2. cape, tail, legs
+ s += cape(ch);
+ const tails = (ch.acc || []).filter(([a]) => a === 'tail' || a === 'horseTail').map(([a, ...r]) => ACC[a](...r).body).join('');
+ s += inked(tails);
+ s += legs(ch, pose);
+ // 3. back arm (non-front arms), torso, body accessories
+ s += torso(ch);
+ const bodyAcc = (ch.acc || []).filter(([a]) => a !== 'tail' && a !== 'horseTail').map(([a, ...r]) => ACC[a](...r).body || '').join('');
+ s += inked(bodyAcc);
+ s += emblem(ch);
+ for (const side of ['L', 'R']) if (!pose.arms[side].front) s += arm(ch, pose, side);
+ s += propAt(ch, pose);
+ for (const side of ['L', 'R']) if (!pose.arms[side].front) s += hand(ch, pose, side);
+ // 4. head
+ s += `` + headBase(ch) + inked(acc.mid) + f.under + inked(hair.front + acc.front) + f.over + ' ';
+ // 5. front arms (thinking hand at chin)
+ for (const side of ['L', 'R']) if (pose.arms[side].front) s += arm(ch, pose, side) + hand(ch, pose, side);
+ s += fx(pose.fx, ch);
+ s += ' ';
+ return `` +
+ `${ch.name} — ${poseName}, ${expr} ${s} \n`;
+}
diff --git a/cast/rig/shot.sh b/cast/rig/shot.sh
new file mode 100644
index 0000000..ff666b8
--- /dev/null
+++ b/cast/rig/shot.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+# Screenshot the gallery with Edge headless (Git Bash). Usage from the repo root:
+# cast/rig/shot.sh [character] [pose] [width] [height]
+# A fresh profile dir per call keeps headless Edge off the desktop browser profile.
+set -euo pipefail
+out=$1; c=${2:-}; p=${3:-}; w=${4:-1400}; h=${5:-1800}
+root=$(cd "$(dirname "$0")/.." && pwd -W)
+prof="$(cygpath -m "${TMPDIR:-/tmp}")/cast-edge-$$"
+rm -f "$out"
+# Edge may hand the job to an already-running instance and return at once, so wait for the file.
+"/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" --headless=new --disable-gpu --hide-scrollbars --user-data-dir="$prof" --screenshot="$(cygpath -m "$out")" --window-size="$w,$h" "file:///$root/gallery.html?c=$c&p=$p" >/dev/null 2>&1 &
+for _ in $(seq 120); do [ -s "$out" ] && break; sleep 0.25; done
+sleep 0.5; ls -la "$out"
diff --git a/cast/stickers/aetheria/neutral-grin.svg b/cast/stickers/aetheria/neutral-grin.svg
new file mode 100644
index 0000000..c1b6e43
--- /dev/null
+++ b/cast/stickers/aetheria/neutral-grin.svg
@@ -0,0 +1 @@
+Aetheria — neutral, grin
diff --git a/cast/stickers/aetheria/neutral-smile.svg b/cast/stickers/aetheria/neutral-smile.svg
new file mode 100644
index 0000000..1628ab8
--- /dev/null
+++ b/cast/stickers/aetheria/neutral-smile.svg
@@ -0,0 +1 @@
+Aetheria — neutral, smile
diff --git a/cast/stickers/aetheria/neutral-surprised.svg b/cast/stickers/aetheria/neutral-surprised.svg
new file mode 100644
index 0000000..b61fa68
--- /dev/null
+++ b/cast/stickers/aetheria/neutral-surprised.svg
@@ -0,0 +1 @@
+Aetheria — neutral, surprised
diff --git a/cast/stickers/brokkr/neutral-grin.svg b/cast/stickers/brokkr/neutral-grin.svg
new file mode 100644
index 0000000..98aeb63
--- /dev/null
+++ b/cast/stickers/brokkr/neutral-grin.svg
@@ -0,0 +1 @@
+Brokkr — neutral, grin
diff --git a/cast/stickers/brokkr/neutral-smile.svg b/cast/stickers/brokkr/neutral-smile.svg
new file mode 100644
index 0000000..9ee8c47
--- /dev/null
+++ b/cast/stickers/brokkr/neutral-smile.svg
@@ -0,0 +1 @@
+Brokkr — neutral, smile
diff --git a/cast/stickers/brokkr/neutral-surprised.svg b/cast/stickers/brokkr/neutral-surprised.svg
new file mode 100644
index 0000000..6bea0fa
--- /dev/null
+++ b/cast/stickers/brokkr/neutral-surprised.svg
@@ -0,0 +1 @@
+Brokkr — neutral, surprised
diff --git a/cast/stickers/druzkai/neutral-grin.svg b/cast/stickers/druzkai/neutral-grin.svg
new file mode 100644
index 0000000..6df59f7
--- /dev/null
+++ b/cast/stickers/druzkai/neutral-grin.svg
@@ -0,0 +1 @@
+Druzkai — neutral, grin
diff --git a/cast/stickers/druzkai/neutral-smile.svg b/cast/stickers/druzkai/neutral-smile.svg
new file mode 100644
index 0000000..bba1f1b
--- /dev/null
+++ b/cast/stickers/druzkai/neutral-smile.svg
@@ -0,0 +1 @@
+Druzkai — neutral, smile
diff --git a/cast/stickers/druzkai/neutral-surprised.svg b/cast/stickers/druzkai/neutral-surprised.svg
new file mode 100644
index 0000000..51d7b49
--- /dev/null
+++ b/cast/stickers/druzkai/neutral-surprised.svg
@@ -0,0 +1 @@
+Druzkai — neutral, surprised
diff --git a/cast/stickers/epiphany/cheer-determined.svg b/cast/stickers/epiphany/cheer-determined.svg
new file mode 100644
index 0000000..19f46eb
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-determined.svg
@@ -0,0 +1 @@
+Epiphany — cheer, determined
diff --git a/cast/stickers/epiphany/cheer-grin.svg b/cast/stickers/epiphany/cheer-grin.svg
new file mode 100644
index 0000000..48ce2df
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-grin.svg
@@ -0,0 +1 @@
+Epiphany — cheer, grin
diff --git a/cast/stickers/epiphany/cheer-happy.svg b/cast/stickers/epiphany/cheer-happy.svg
new file mode 100644
index 0000000..b5d8515
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-happy.svg
@@ -0,0 +1 @@
+Epiphany — cheer, happy
diff --git a/cast/stickers/epiphany/cheer-neutral.svg b/cast/stickers/epiphany/cheer-neutral.svg
new file mode 100644
index 0000000..9806b70
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-neutral.svg
@@ -0,0 +1 @@
+Epiphany — cheer, neutral
diff --git a/cast/stickers/epiphany/cheer-sleepy.svg b/cast/stickers/epiphany/cheer-sleepy.svg
new file mode 100644
index 0000000..17f39c8
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — cheer, sleepy z z
diff --git a/cast/stickers/epiphany/cheer-smile.svg b/cast/stickers/epiphany/cheer-smile.svg
new file mode 100644
index 0000000..2ea30aa
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-smile.svg
@@ -0,0 +1 @@
+Epiphany — cheer, smile
diff --git a/cast/stickers/epiphany/cheer-surprised.svg b/cast/stickers/epiphany/cheer-surprised.svg
new file mode 100644
index 0000000..9f35154
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-surprised.svg
@@ -0,0 +1 @@
+Epiphany — cheer, surprised
diff --git a/cast/stickers/epiphany/cheer-worried.svg b/cast/stickers/epiphany/cheer-worried.svg
new file mode 100644
index 0000000..f4147f7
--- /dev/null
+++ b/cast/stickers/epiphany/cheer-worried.svg
@@ -0,0 +1 @@
+Epiphany — cheer, worried
diff --git a/cast/stickers/epiphany/neutral-determined.svg b/cast/stickers/epiphany/neutral-determined.svg
new file mode 100644
index 0000000..771b347
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-determined.svg
@@ -0,0 +1 @@
+Epiphany — neutral, determined
diff --git a/cast/stickers/epiphany/neutral-grin.svg b/cast/stickers/epiphany/neutral-grin.svg
new file mode 100644
index 0000000..2cc5369
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-grin.svg
@@ -0,0 +1 @@
+Epiphany — neutral, grin
diff --git a/cast/stickers/epiphany/neutral-happy.svg b/cast/stickers/epiphany/neutral-happy.svg
new file mode 100644
index 0000000..91a6fdc
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-happy.svg
@@ -0,0 +1 @@
+Epiphany — neutral, happy
diff --git a/cast/stickers/epiphany/neutral-neutral.svg b/cast/stickers/epiphany/neutral-neutral.svg
new file mode 100644
index 0000000..e9d9313
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-neutral.svg
@@ -0,0 +1 @@
+Epiphany — neutral, neutral
diff --git a/cast/stickers/epiphany/neutral-sleepy.svg b/cast/stickers/epiphany/neutral-sleepy.svg
new file mode 100644
index 0000000..8e40ee2
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — neutral, sleepy z z
diff --git a/cast/stickers/epiphany/neutral-smile.svg b/cast/stickers/epiphany/neutral-smile.svg
new file mode 100644
index 0000000..a702f8f
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-smile.svg
@@ -0,0 +1 @@
+Epiphany — neutral, smile
diff --git a/cast/stickers/epiphany/neutral-surprised.svg b/cast/stickers/epiphany/neutral-surprised.svg
new file mode 100644
index 0000000..882915b
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-surprised.svg
@@ -0,0 +1 @@
+Epiphany — neutral, surprised
diff --git a/cast/stickers/epiphany/neutral-worried.svg b/cast/stickers/epiphany/neutral-worried.svg
new file mode 100644
index 0000000..8422d5d
--- /dev/null
+++ b/cast/stickers/epiphany/neutral-worried.svg
@@ -0,0 +1 @@
+Epiphany — neutral, worried
diff --git a/cast/stickers/epiphany/presenting-determined.svg b/cast/stickers/epiphany/presenting-determined.svg
new file mode 100644
index 0000000..912397c
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-determined.svg
@@ -0,0 +1 @@
+Epiphany — presenting, determined
diff --git a/cast/stickers/epiphany/presenting-grin.svg b/cast/stickers/epiphany/presenting-grin.svg
new file mode 100644
index 0000000..68b4403
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-grin.svg
@@ -0,0 +1 @@
+Epiphany — presenting, grin
diff --git a/cast/stickers/epiphany/presenting-happy.svg b/cast/stickers/epiphany/presenting-happy.svg
new file mode 100644
index 0000000..c8c2b70
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-happy.svg
@@ -0,0 +1 @@
+Epiphany — presenting, happy
diff --git a/cast/stickers/epiphany/presenting-neutral.svg b/cast/stickers/epiphany/presenting-neutral.svg
new file mode 100644
index 0000000..76777f4
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-neutral.svg
@@ -0,0 +1 @@
+Epiphany — presenting, neutral
diff --git a/cast/stickers/epiphany/presenting-sleepy.svg b/cast/stickers/epiphany/presenting-sleepy.svg
new file mode 100644
index 0000000..07741f6
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — presenting, sleepy z z
diff --git a/cast/stickers/epiphany/presenting-smile.svg b/cast/stickers/epiphany/presenting-smile.svg
new file mode 100644
index 0000000..9c0ed62
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-smile.svg
@@ -0,0 +1 @@
+Epiphany — presenting, smile
diff --git a/cast/stickers/epiphany/presenting-surprised.svg b/cast/stickers/epiphany/presenting-surprised.svg
new file mode 100644
index 0000000..a4d8997
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-surprised.svg
@@ -0,0 +1 @@
+Epiphany — presenting, surprised
diff --git a/cast/stickers/epiphany/presenting-worried.svg b/cast/stickers/epiphany/presenting-worried.svg
new file mode 100644
index 0000000..d7d68e8
--- /dev/null
+++ b/cast/stickers/epiphany/presenting-worried.svg
@@ -0,0 +1 @@
+Epiphany — presenting, worried
diff --git a/cast/stickers/epiphany/surprised-determined.svg b/cast/stickers/epiphany/surprised-determined.svg
new file mode 100644
index 0000000..4b825fd
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-determined.svg
@@ -0,0 +1 @@
+Epiphany — surprised, determined
diff --git a/cast/stickers/epiphany/surprised-grin.svg b/cast/stickers/epiphany/surprised-grin.svg
new file mode 100644
index 0000000..658872d
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-grin.svg
@@ -0,0 +1 @@
+Epiphany — surprised, grin
diff --git a/cast/stickers/epiphany/surprised-happy.svg b/cast/stickers/epiphany/surprised-happy.svg
new file mode 100644
index 0000000..0b7b900
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-happy.svg
@@ -0,0 +1 @@
+Epiphany — surprised, happy
diff --git a/cast/stickers/epiphany/surprised-neutral.svg b/cast/stickers/epiphany/surprised-neutral.svg
new file mode 100644
index 0000000..51f4e92
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-neutral.svg
@@ -0,0 +1 @@
+Epiphany — surprised, neutral
diff --git a/cast/stickers/epiphany/surprised-sleepy.svg b/cast/stickers/epiphany/surprised-sleepy.svg
new file mode 100644
index 0000000..738cea3
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — surprised, sleepy z z
diff --git a/cast/stickers/epiphany/surprised-smile.svg b/cast/stickers/epiphany/surprised-smile.svg
new file mode 100644
index 0000000..cec0dfc
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-smile.svg
@@ -0,0 +1 @@
+Epiphany — surprised, smile
diff --git a/cast/stickers/epiphany/surprised-surprised.svg b/cast/stickers/epiphany/surprised-surprised.svg
new file mode 100644
index 0000000..16c026d
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-surprised.svg
@@ -0,0 +1 @@
+Epiphany — surprised, surprised
diff --git a/cast/stickers/epiphany/surprised-worried.svg b/cast/stickers/epiphany/surprised-worried.svg
new file mode 100644
index 0000000..7d09012
--- /dev/null
+++ b/cast/stickers/epiphany/surprised-worried.svg
@@ -0,0 +1 @@
+Epiphany — surprised, worried
diff --git a/cast/stickers/epiphany/thinking-determined.svg b/cast/stickers/epiphany/thinking-determined.svg
new file mode 100644
index 0000000..47a8092
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-determined.svg
@@ -0,0 +1 @@
+Epiphany — thinking, determined
diff --git a/cast/stickers/epiphany/thinking-grin.svg b/cast/stickers/epiphany/thinking-grin.svg
new file mode 100644
index 0000000..54d5a41
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-grin.svg
@@ -0,0 +1 @@
+Epiphany — thinking, grin
diff --git a/cast/stickers/epiphany/thinking-happy.svg b/cast/stickers/epiphany/thinking-happy.svg
new file mode 100644
index 0000000..37bf12f
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-happy.svg
@@ -0,0 +1 @@
+Epiphany — thinking, happy
diff --git a/cast/stickers/epiphany/thinking-neutral.svg b/cast/stickers/epiphany/thinking-neutral.svg
new file mode 100644
index 0000000..8b8495d
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-neutral.svg
@@ -0,0 +1 @@
+Epiphany — thinking, neutral
diff --git a/cast/stickers/epiphany/thinking-sleepy.svg b/cast/stickers/epiphany/thinking-sleepy.svg
new file mode 100644
index 0000000..1c9537e
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — thinking, sleepy z z
diff --git a/cast/stickers/epiphany/thinking-smile.svg b/cast/stickers/epiphany/thinking-smile.svg
new file mode 100644
index 0000000..830d3d4
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-smile.svg
@@ -0,0 +1 @@
+Epiphany — thinking, smile
diff --git a/cast/stickers/epiphany/thinking-surprised.svg b/cast/stickers/epiphany/thinking-surprised.svg
new file mode 100644
index 0000000..ad385d2
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-surprised.svg
@@ -0,0 +1 @@
+Epiphany — thinking, surprised
diff --git a/cast/stickers/epiphany/thinking-worried.svg b/cast/stickers/epiphany/thinking-worried.svg
new file mode 100644
index 0000000..7ec7f26
--- /dev/null
+++ b/cast/stickers/epiphany/thinking-worried.svg
@@ -0,0 +1 @@
+Epiphany — thinking, worried
diff --git a/cast/stickers/epiphany/waving-determined.svg b/cast/stickers/epiphany/waving-determined.svg
new file mode 100644
index 0000000..b26c162
--- /dev/null
+++ b/cast/stickers/epiphany/waving-determined.svg
@@ -0,0 +1 @@
+Epiphany — waving, determined
diff --git a/cast/stickers/epiphany/waving-grin.svg b/cast/stickers/epiphany/waving-grin.svg
new file mode 100644
index 0000000..01e4598
--- /dev/null
+++ b/cast/stickers/epiphany/waving-grin.svg
@@ -0,0 +1 @@
+Epiphany — waving, grin
diff --git a/cast/stickers/epiphany/waving-happy.svg b/cast/stickers/epiphany/waving-happy.svg
new file mode 100644
index 0000000..55cc6b2
--- /dev/null
+++ b/cast/stickers/epiphany/waving-happy.svg
@@ -0,0 +1 @@
+Epiphany — waving, happy
diff --git a/cast/stickers/epiphany/waving-neutral.svg b/cast/stickers/epiphany/waving-neutral.svg
new file mode 100644
index 0000000..6efe8aa
--- /dev/null
+++ b/cast/stickers/epiphany/waving-neutral.svg
@@ -0,0 +1 @@
+Epiphany — waving, neutral
diff --git a/cast/stickers/epiphany/waving-sleepy.svg b/cast/stickers/epiphany/waving-sleepy.svg
new file mode 100644
index 0000000..4553627
--- /dev/null
+++ b/cast/stickers/epiphany/waving-sleepy.svg
@@ -0,0 +1 @@
+Epiphany — waving, sleepy z z
diff --git a/cast/stickers/epiphany/waving-smile.svg b/cast/stickers/epiphany/waving-smile.svg
new file mode 100644
index 0000000..830aba0
--- /dev/null
+++ b/cast/stickers/epiphany/waving-smile.svg
@@ -0,0 +1 @@
+Epiphany — waving, smile
diff --git a/cast/stickers/epiphany/waving-surprised.svg b/cast/stickers/epiphany/waving-surprised.svg
new file mode 100644
index 0000000..9a1291e
--- /dev/null
+++ b/cast/stickers/epiphany/waving-surprised.svg
@@ -0,0 +1 @@
+Epiphany — waving, surprised
diff --git a/cast/stickers/epiphany/waving-worried.svg b/cast/stickers/epiphany/waving-worried.svg
new file mode 100644
index 0000000..3a16a3b
--- /dev/null
+++ b/cast/stickers/epiphany/waving-worried.svg
@@ -0,0 +1 @@
+Epiphany — waving, worried
diff --git a/cast/stickers/eureka/cheer-determined.svg b/cast/stickers/eureka/cheer-determined.svg
new file mode 100644
index 0000000..e35e56c
--- /dev/null
+++ b/cast/stickers/eureka/cheer-determined.svg
@@ -0,0 +1 @@
+Eureka — cheer, determined
diff --git a/cast/stickers/eureka/cheer-grin.svg b/cast/stickers/eureka/cheer-grin.svg
new file mode 100644
index 0000000..a90fe72
--- /dev/null
+++ b/cast/stickers/eureka/cheer-grin.svg
@@ -0,0 +1 @@
+Eureka — cheer, grin
diff --git a/cast/stickers/eureka/cheer-happy.svg b/cast/stickers/eureka/cheer-happy.svg
new file mode 100644
index 0000000..cde89fb
--- /dev/null
+++ b/cast/stickers/eureka/cheer-happy.svg
@@ -0,0 +1 @@
+Eureka — cheer, happy
diff --git a/cast/stickers/eureka/cheer-neutral.svg b/cast/stickers/eureka/cheer-neutral.svg
new file mode 100644
index 0000000..d22ef84
--- /dev/null
+++ b/cast/stickers/eureka/cheer-neutral.svg
@@ -0,0 +1 @@
+Eureka — cheer, neutral
diff --git a/cast/stickers/eureka/cheer-sleepy.svg b/cast/stickers/eureka/cheer-sleepy.svg
new file mode 100644
index 0000000..710e56f
--- /dev/null
+++ b/cast/stickers/eureka/cheer-sleepy.svg
@@ -0,0 +1 @@
+Eureka — cheer, sleepy z z
diff --git a/cast/stickers/eureka/cheer-smile.svg b/cast/stickers/eureka/cheer-smile.svg
new file mode 100644
index 0000000..cf351cb
--- /dev/null
+++ b/cast/stickers/eureka/cheer-smile.svg
@@ -0,0 +1 @@
+Eureka — cheer, smile
diff --git a/cast/stickers/eureka/cheer-surprised.svg b/cast/stickers/eureka/cheer-surprised.svg
new file mode 100644
index 0000000..00fd389
--- /dev/null
+++ b/cast/stickers/eureka/cheer-surprised.svg
@@ -0,0 +1 @@
+Eureka — cheer, surprised
diff --git a/cast/stickers/eureka/cheer-worried.svg b/cast/stickers/eureka/cheer-worried.svg
new file mode 100644
index 0000000..d425e30
--- /dev/null
+++ b/cast/stickers/eureka/cheer-worried.svg
@@ -0,0 +1 @@
+Eureka — cheer, worried
diff --git a/cast/stickers/eureka/neutral-determined.svg b/cast/stickers/eureka/neutral-determined.svg
new file mode 100644
index 0000000..197aba1
--- /dev/null
+++ b/cast/stickers/eureka/neutral-determined.svg
@@ -0,0 +1 @@
+Eureka — neutral, determined
diff --git a/cast/stickers/eureka/neutral-grin.svg b/cast/stickers/eureka/neutral-grin.svg
new file mode 100644
index 0000000..e09f572
--- /dev/null
+++ b/cast/stickers/eureka/neutral-grin.svg
@@ -0,0 +1 @@
+Eureka — neutral, grin
diff --git a/cast/stickers/eureka/neutral-happy.svg b/cast/stickers/eureka/neutral-happy.svg
new file mode 100644
index 0000000..bb44ac6
--- /dev/null
+++ b/cast/stickers/eureka/neutral-happy.svg
@@ -0,0 +1 @@
+Eureka — neutral, happy
diff --git a/cast/stickers/eureka/neutral-neutral.svg b/cast/stickers/eureka/neutral-neutral.svg
new file mode 100644
index 0000000..a65e3e3
--- /dev/null
+++ b/cast/stickers/eureka/neutral-neutral.svg
@@ -0,0 +1 @@
+Eureka — neutral, neutral
diff --git a/cast/stickers/eureka/neutral-sleepy.svg b/cast/stickers/eureka/neutral-sleepy.svg
new file mode 100644
index 0000000..289cc1a
--- /dev/null
+++ b/cast/stickers/eureka/neutral-sleepy.svg
@@ -0,0 +1 @@
+Eureka — neutral, sleepy z z
diff --git a/cast/stickers/eureka/neutral-smile.svg b/cast/stickers/eureka/neutral-smile.svg
new file mode 100644
index 0000000..004ec8e
--- /dev/null
+++ b/cast/stickers/eureka/neutral-smile.svg
@@ -0,0 +1 @@
+Eureka — neutral, smile
diff --git a/cast/stickers/eureka/neutral-surprised.svg b/cast/stickers/eureka/neutral-surprised.svg
new file mode 100644
index 0000000..f856996
--- /dev/null
+++ b/cast/stickers/eureka/neutral-surprised.svg
@@ -0,0 +1 @@
+Eureka — neutral, surprised
diff --git a/cast/stickers/eureka/neutral-worried.svg b/cast/stickers/eureka/neutral-worried.svg
new file mode 100644
index 0000000..48dbc33
--- /dev/null
+++ b/cast/stickers/eureka/neutral-worried.svg
@@ -0,0 +1 @@
+Eureka — neutral, worried
diff --git a/cast/stickers/eureka/presenting-determined.svg b/cast/stickers/eureka/presenting-determined.svg
new file mode 100644
index 0000000..634913b
--- /dev/null
+++ b/cast/stickers/eureka/presenting-determined.svg
@@ -0,0 +1 @@
+Eureka — presenting, determined
diff --git a/cast/stickers/eureka/presenting-grin.svg b/cast/stickers/eureka/presenting-grin.svg
new file mode 100644
index 0000000..782be7c
--- /dev/null
+++ b/cast/stickers/eureka/presenting-grin.svg
@@ -0,0 +1 @@
+Eureka — presenting, grin
diff --git a/cast/stickers/eureka/presenting-happy.svg b/cast/stickers/eureka/presenting-happy.svg
new file mode 100644
index 0000000..5ffcfc2
--- /dev/null
+++ b/cast/stickers/eureka/presenting-happy.svg
@@ -0,0 +1 @@
+Eureka — presenting, happy
diff --git a/cast/stickers/eureka/presenting-neutral.svg b/cast/stickers/eureka/presenting-neutral.svg
new file mode 100644
index 0000000..2e8ff43
--- /dev/null
+++ b/cast/stickers/eureka/presenting-neutral.svg
@@ -0,0 +1 @@
+Eureka — presenting, neutral
diff --git a/cast/stickers/eureka/presenting-sleepy.svg b/cast/stickers/eureka/presenting-sleepy.svg
new file mode 100644
index 0000000..9abb636
--- /dev/null
+++ b/cast/stickers/eureka/presenting-sleepy.svg
@@ -0,0 +1 @@
+Eureka — presenting, sleepy z z
diff --git a/cast/stickers/eureka/presenting-smile.svg b/cast/stickers/eureka/presenting-smile.svg
new file mode 100644
index 0000000..46292a0
--- /dev/null
+++ b/cast/stickers/eureka/presenting-smile.svg
@@ -0,0 +1 @@
+Eureka — presenting, smile
diff --git a/cast/stickers/eureka/presenting-surprised.svg b/cast/stickers/eureka/presenting-surprised.svg
new file mode 100644
index 0000000..7fe567b
--- /dev/null
+++ b/cast/stickers/eureka/presenting-surprised.svg
@@ -0,0 +1 @@
+Eureka — presenting, surprised
diff --git a/cast/stickers/eureka/presenting-worried.svg b/cast/stickers/eureka/presenting-worried.svg
new file mode 100644
index 0000000..16189dd
--- /dev/null
+++ b/cast/stickers/eureka/presenting-worried.svg
@@ -0,0 +1 @@
+Eureka — presenting, worried
diff --git a/cast/stickers/eureka/surprised-determined.svg b/cast/stickers/eureka/surprised-determined.svg
new file mode 100644
index 0000000..4e84850
--- /dev/null
+++ b/cast/stickers/eureka/surprised-determined.svg
@@ -0,0 +1 @@
+Eureka — surprised, determined
diff --git a/cast/stickers/eureka/surprised-grin.svg b/cast/stickers/eureka/surprised-grin.svg
new file mode 100644
index 0000000..d35e9f1
--- /dev/null
+++ b/cast/stickers/eureka/surprised-grin.svg
@@ -0,0 +1 @@
+Eureka — surprised, grin
diff --git a/cast/stickers/eureka/surprised-happy.svg b/cast/stickers/eureka/surprised-happy.svg
new file mode 100644
index 0000000..5d2f748
--- /dev/null
+++ b/cast/stickers/eureka/surprised-happy.svg
@@ -0,0 +1 @@
+Eureka — surprised, happy
diff --git a/cast/stickers/eureka/surprised-neutral.svg b/cast/stickers/eureka/surprised-neutral.svg
new file mode 100644
index 0000000..52d7ff2
--- /dev/null
+++ b/cast/stickers/eureka/surprised-neutral.svg
@@ -0,0 +1 @@
+Eureka — surprised, neutral
diff --git a/cast/stickers/eureka/surprised-sleepy.svg b/cast/stickers/eureka/surprised-sleepy.svg
new file mode 100644
index 0000000..51a4652
--- /dev/null
+++ b/cast/stickers/eureka/surprised-sleepy.svg
@@ -0,0 +1 @@
+Eureka — surprised, sleepy z z
diff --git a/cast/stickers/eureka/surprised-smile.svg b/cast/stickers/eureka/surprised-smile.svg
new file mode 100644
index 0000000..ebf8cd9
--- /dev/null
+++ b/cast/stickers/eureka/surprised-smile.svg
@@ -0,0 +1 @@
+Eureka — surprised, smile
diff --git a/cast/stickers/eureka/surprised-surprised.svg b/cast/stickers/eureka/surprised-surprised.svg
new file mode 100644
index 0000000..a7f782c
--- /dev/null
+++ b/cast/stickers/eureka/surprised-surprised.svg
@@ -0,0 +1 @@
+Eureka — surprised, surprised
diff --git a/cast/stickers/eureka/surprised-worried.svg b/cast/stickers/eureka/surprised-worried.svg
new file mode 100644
index 0000000..9978ec9
--- /dev/null
+++ b/cast/stickers/eureka/surprised-worried.svg
@@ -0,0 +1 @@
+Eureka — surprised, worried
diff --git a/cast/stickers/eureka/thinking-determined.svg b/cast/stickers/eureka/thinking-determined.svg
new file mode 100644
index 0000000..1b74586
--- /dev/null
+++ b/cast/stickers/eureka/thinking-determined.svg
@@ -0,0 +1 @@
+Eureka — thinking, determined
diff --git a/cast/stickers/eureka/thinking-grin.svg b/cast/stickers/eureka/thinking-grin.svg
new file mode 100644
index 0000000..9992a4a
--- /dev/null
+++ b/cast/stickers/eureka/thinking-grin.svg
@@ -0,0 +1 @@
+Eureka — thinking, grin
diff --git a/cast/stickers/eureka/thinking-happy.svg b/cast/stickers/eureka/thinking-happy.svg
new file mode 100644
index 0000000..820d3d3
--- /dev/null
+++ b/cast/stickers/eureka/thinking-happy.svg
@@ -0,0 +1 @@
+Eureka — thinking, happy
diff --git a/cast/stickers/eureka/thinking-neutral.svg b/cast/stickers/eureka/thinking-neutral.svg
new file mode 100644
index 0000000..5264af2
--- /dev/null
+++ b/cast/stickers/eureka/thinking-neutral.svg
@@ -0,0 +1 @@
+Eureka — thinking, neutral
diff --git a/cast/stickers/eureka/thinking-sleepy.svg b/cast/stickers/eureka/thinking-sleepy.svg
new file mode 100644
index 0000000..873da02
--- /dev/null
+++ b/cast/stickers/eureka/thinking-sleepy.svg
@@ -0,0 +1 @@
+Eureka — thinking, sleepy z z
diff --git a/cast/stickers/eureka/thinking-smile.svg b/cast/stickers/eureka/thinking-smile.svg
new file mode 100644
index 0000000..87cc221
--- /dev/null
+++ b/cast/stickers/eureka/thinking-smile.svg
@@ -0,0 +1 @@
+Eureka — thinking, smile
diff --git a/cast/stickers/eureka/thinking-surprised.svg b/cast/stickers/eureka/thinking-surprised.svg
new file mode 100644
index 0000000..3101657
--- /dev/null
+++ b/cast/stickers/eureka/thinking-surprised.svg
@@ -0,0 +1 @@
+Eureka — thinking, surprised
diff --git a/cast/stickers/eureka/thinking-worried.svg b/cast/stickers/eureka/thinking-worried.svg
new file mode 100644
index 0000000..f4afad0
--- /dev/null
+++ b/cast/stickers/eureka/thinking-worried.svg
@@ -0,0 +1 @@
+Eureka — thinking, worried
diff --git a/cast/stickers/eureka/waving-determined.svg b/cast/stickers/eureka/waving-determined.svg
new file mode 100644
index 0000000..82af318
--- /dev/null
+++ b/cast/stickers/eureka/waving-determined.svg
@@ -0,0 +1 @@
+Eureka — waving, determined
diff --git a/cast/stickers/eureka/waving-grin.svg b/cast/stickers/eureka/waving-grin.svg
new file mode 100644
index 0000000..d27f276
--- /dev/null
+++ b/cast/stickers/eureka/waving-grin.svg
@@ -0,0 +1 @@
+Eureka — waving, grin
diff --git a/cast/stickers/eureka/waving-happy.svg b/cast/stickers/eureka/waving-happy.svg
new file mode 100644
index 0000000..bbe6d1f
--- /dev/null
+++ b/cast/stickers/eureka/waving-happy.svg
@@ -0,0 +1 @@
+Eureka — waving, happy
diff --git a/cast/stickers/eureka/waving-neutral.svg b/cast/stickers/eureka/waving-neutral.svg
new file mode 100644
index 0000000..0c55bc9
--- /dev/null
+++ b/cast/stickers/eureka/waving-neutral.svg
@@ -0,0 +1 @@
+Eureka — waving, neutral
diff --git a/cast/stickers/eureka/waving-sleepy.svg b/cast/stickers/eureka/waving-sleepy.svg
new file mode 100644
index 0000000..3f56db2
--- /dev/null
+++ b/cast/stickers/eureka/waving-sleepy.svg
@@ -0,0 +1 @@
+Eureka — waving, sleepy z z
diff --git a/cast/stickers/eureka/waving-smile.svg b/cast/stickers/eureka/waving-smile.svg
new file mode 100644
index 0000000..9fe59c8
--- /dev/null
+++ b/cast/stickers/eureka/waving-smile.svg
@@ -0,0 +1 @@
+Eureka — waving, smile
diff --git a/cast/stickers/eureka/waving-surprised.svg b/cast/stickers/eureka/waving-surprised.svg
new file mode 100644
index 0000000..2cad5b3
--- /dev/null
+++ b/cast/stickers/eureka/waving-surprised.svg
@@ -0,0 +1 @@
+Eureka — waving, surprised
diff --git a/cast/stickers/eureka/waving-worried.svg b/cast/stickers/eureka/waving-worried.svg
new file mode 100644
index 0000000..7080ca2
--- /dev/null
+++ b/cast/stickers/eureka/waving-worried.svg
@@ -0,0 +1 @@
+Eureka — waving, worried
diff --git a/cast/stickers/eve/neutral-grin.svg b/cast/stickers/eve/neutral-grin.svg
new file mode 100644
index 0000000..f4f7de2
--- /dev/null
+++ b/cast/stickers/eve/neutral-grin.svg
@@ -0,0 +1 @@
+Eve — neutral, grin
diff --git a/cast/stickers/eve/neutral-smile.svg b/cast/stickers/eve/neutral-smile.svg
new file mode 100644
index 0000000..76b019e
--- /dev/null
+++ b/cast/stickers/eve/neutral-smile.svg
@@ -0,0 +1 @@
+Eve — neutral, smile
diff --git a/cast/stickers/eve/neutral-surprised.svg b/cast/stickers/eve/neutral-surprised.svg
new file mode 100644
index 0000000..0a1636c
--- /dev/null
+++ b/cast/stickers/eve/neutral-surprised.svg
@@ -0,0 +1 @@
+Eve — neutral, surprised
diff --git a/cast/stickers/fensalir/neutral-grin.svg b/cast/stickers/fensalir/neutral-grin.svg
new file mode 100644
index 0000000..b5af4fd
--- /dev/null
+++ b/cast/stickers/fensalir/neutral-grin.svg
@@ -0,0 +1 @@
+Fensalir — neutral, grin
diff --git a/cast/stickers/fensalir/neutral-smile.svg b/cast/stickers/fensalir/neutral-smile.svg
new file mode 100644
index 0000000..9778f9a
--- /dev/null
+++ b/cast/stickers/fensalir/neutral-smile.svg
@@ -0,0 +1 @@
+Fensalir — neutral, smile
diff --git a/cast/stickers/fensalir/neutral-surprised.svg b/cast/stickers/fensalir/neutral-surprised.svg
new file mode 100644
index 0000000..e738a2e
--- /dev/null
+++ b/cast/stickers/fensalir/neutral-surprised.svg
@@ -0,0 +1 @@
+Fensalir — neutral, surprised
diff --git a/cast/stickers/gjallar/neutral-grin.svg b/cast/stickers/gjallar/neutral-grin.svg
new file mode 100644
index 0000000..6a9a046
--- /dev/null
+++ b/cast/stickers/gjallar/neutral-grin.svg
@@ -0,0 +1 @@
+Gjallar — neutral, grin
diff --git a/cast/stickers/gjallar/neutral-smile.svg b/cast/stickers/gjallar/neutral-smile.svg
new file mode 100644
index 0000000..45f2300
--- /dev/null
+++ b/cast/stickers/gjallar/neutral-smile.svg
@@ -0,0 +1 @@
+Gjallar — neutral, smile
diff --git a/cast/stickers/gjallar/neutral-surprised.svg b/cast/stickers/gjallar/neutral-surprised.svg
new file mode 100644
index 0000000..78269bf
--- /dev/null
+++ b/cast/stickers/gjallar/neutral-surprised.svg
@@ -0,0 +1 @@
+Gjallar — neutral, surprised
diff --git a/cast/stickers/heimdall/neutral-grin.svg b/cast/stickers/heimdall/neutral-grin.svg
new file mode 100644
index 0000000..e150939
--- /dev/null
+++ b/cast/stickers/heimdall/neutral-grin.svg
@@ -0,0 +1 @@
+Heimdall — neutral, grin
diff --git a/cast/stickers/heimdall/neutral-smile.svg b/cast/stickers/heimdall/neutral-smile.svg
new file mode 100644
index 0000000..66c9c04
--- /dev/null
+++ b/cast/stickers/heimdall/neutral-smile.svg
@@ -0,0 +1 @@
+Heimdall — neutral, smile
diff --git a/cast/stickers/heimdall/neutral-surprised.svg b/cast/stickers/heimdall/neutral-surprised.svg
new file mode 100644
index 0000000..4fbab4b
--- /dev/null
+++ b/cast/stickers/heimdall/neutral-surprised.svg
@@ -0,0 +1 @@
+Heimdall — neutral, surprised
diff --git a/cast/stickers/hermodr/neutral-grin.svg b/cast/stickers/hermodr/neutral-grin.svg
new file mode 100644
index 0000000..d5b7d39
--- /dev/null
+++ b/cast/stickers/hermodr/neutral-grin.svg
@@ -0,0 +1 @@
+Hermodr — neutral, grin
diff --git a/cast/stickers/hermodr/neutral-smile.svg b/cast/stickers/hermodr/neutral-smile.svg
new file mode 100644
index 0000000..6ecfc2e
--- /dev/null
+++ b/cast/stickers/hermodr/neutral-smile.svg
@@ -0,0 +1 @@
+Hermodr — neutral, smile
diff --git a/cast/stickers/hermodr/neutral-surprised.svg b/cast/stickers/hermodr/neutral-surprised.svg
new file mode 100644
index 0000000..58b7f67
--- /dev/null
+++ b/cast/stickers/hermodr/neutral-surprised.svg
@@ -0,0 +1 @@
+Hermodr — neutral, surprised
diff --git a/cast/stickers/huginn/cheer-determined.svg b/cast/stickers/huginn/cheer-determined.svg
new file mode 100644
index 0000000..d5e5549
--- /dev/null
+++ b/cast/stickers/huginn/cheer-determined.svg
@@ -0,0 +1 @@
+Huginn — cheer, determined
diff --git a/cast/stickers/huginn/cheer-grin.svg b/cast/stickers/huginn/cheer-grin.svg
new file mode 100644
index 0000000..f2f28cb
--- /dev/null
+++ b/cast/stickers/huginn/cheer-grin.svg
@@ -0,0 +1 @@
+Huginn — cheer, grin
diff --git a/cast/stickers/huginn/cheer-happy.svg b/cast/stickers/huginn/cheer-happy.svg
new file mode 100644
index 0000000..b332858
--- /dev/null
+++ b/cast/stickers/huginn/cheer-happy.svg
@@ -0,0 +1 @@
+Huginn — cheer, happy
diff --git a/cast/stickers/huginn/cheer-neutral.svg b/cast/stickers/huginn/cheer-neutral.svg
new file mode 100644
index 0000000..0851562
--- /dev/null
+++ b/cast/stickers/huginn/cheer-neutral.svg
@@ -0,0 +1 @@
+Huginn — cheer, neutral
diff --git a/cast/stickers/huginn/cheer-sleepy.svg b/cast/stickers/huginn/cheer-sleepy.svg
new file mode 100644
index 0000000..a95916d
--- /dev/null
+++ b/cast/stickers/huginn/cheer-sleepy.svg
@@ -0,0 +1 @@
+Huginn — cheer, sleepy z z
diff --git a/cast/stickers/huginn/cheer-smile.svg b/cast/stickers/huginn/cheer-smile.svg
new file mode 100644
index 0000000..42d6608
--- /dev/null
+++ b/cast/stickers/huginn/cheer-smile.svg
@@ -0,0 +1 @@
+Huginn — cheer, smile
diff --git a/cast/stickers/huginn/cheer-surprised.svg b/cast/stickers/huginn/cheer-surprised.svg
new file mode 100644
index 0000000..0ee99c4
--- /dev/null
+++ b/cast/stickers/huginn/cheer-surprised.svg
@@ -0,0 +1 @@
+Huginn — cheer, surprised
diff --git a/cast/stickers/huginn/cheer-worried.svg b/cast/stickers/huginn/cheer-worried.svg
new file mode 100644
index 0000000..7135032
--- /dev/null
+++ b/cast/stickers/huginn/cheer-worried.svg
@@ -0,0 +1 @@
+Huginn — cheer, worried
diff --git a/cast/stickers/huginn/neutral-determined.svg b/cast/stickers/huginn/neutral-determined.svg
new file mode 100644
index 0000000..67b0566
--- /dev/null
+++ b/cast/stickers/huginn/neutral-determined.svg
@@ -0,0 +1 @@
+Huginn — neutral, determined
diff --git a/cast/stickers/huginn/neutral-grin.svg b/cast/stickers/huginn/neutral-grin.svg
new file mode 100644
index 0000000..09fcff8
--- /dev/null
+++ b/cast/stickers/huginn/neutral-grin.svg
@@ -0,0 +1 @@
+Huginn — neutral, grin
diff --git a/cast/stickers/huginn/neutral-happy.svg b/cast/stickers/huginn/neutral-happy.svg
new file mode 100644
index 0000000..d1125a6
--- /dev/null
+++ b/cast/stickers/huginn/neutral-happy.svg
@@ -0,0 +1 @@
+Huginn — neutral, happy
diff --git a/cast/stickers/huginn/neutral-neutral.svg b/cast/stickers/huginn/neutral-neutral.svg
new file mode 100644
index 0000000..3d36efe
--- /dev/null
+++ b/cast/stickers/huginn/neutral-neutral.svg
@@ -0,0 +1 @@
+Huginn — neutral, neutral
diff --git a/cast/stickers/huginn/neutral-sleepy.svg b/cast/stickers/huginn/neutral-sleepy.svg
new file mode 100644
index 0000000..bad350b
--- /dev/null
+++ b/cast/stickers/huginn/neutral-sleepy.svg
@@ -0,0 +1 @@
+Huginn — neutral, sleepy z z
diff --git a/cast/stickers/huginn/neutral-smile.svg b/cast/stickers/huginn/neutral-smile.svg
new file mode 100644
index 0000000..f8fb13c
--- /dev/null
+++ b/cast/stickers/huginn/neutral-smile.svg
@@ -0,0 +1 @@
+Huginn — neutral, smile
diff --git a/cast/stickers/huginn/neutral-surprised.svg b/cast/stickers/huginn/neutral-surprised.svg
new file mode 100644
index 0000000..0801b25
--- /dev/null
+++ b/cast/stickers/huginn/neutral-surprised.svg
@@ -0,0 +1 @@
+Huginn — neutral, surprised
diff --git a/cast/stickers/huginn/neutral-worried.svg b/cast/stickers/huginn/neutral-worried.svg
new file mode 100644
index 0000000..648cf35
--- /dev/null
+++ b/cast/stickers/huginn/neutral-worried.svg
@@ -0,0 +1 @@
+Huginn — neutral, worried
diff --git a/cast/stickers/huginn/presenting-determined.svg b/cast/stickers/huginn/presenting-determined.svg
new file mode 100644
index 0000000..eefb8f6
--- /dev/null
+++ b/cast/stickers/huginn/presenting-determined.svg
@@ -0,0 +1 @@
+Huginn — presenting, determined
diff --git a/cast/stickers/huginn/presenting-grin.svg b/cast/stickers/huginn/presenting-grin.svg
new file mode 100644
index 0000000..d3a6512
--- /dev/null
+++ b/cast/stickers/huginn/presenting-grin.svg
@@ -0,0 +1 @@
+Huginn — presenting, grin
diff --git a/cast/stickers/huginn/presenting-happy.svg b/cast/stickers/huginn/presenting-happy.svg
new file mode 100644
index 0000000..ddf4e93
--- /dev/null
+++ b/cast/stickers/huginn/presenting-happy.svg
@@ -0,0 +1 @@
+Huginn — presenting, happy
diff --git a/cast/stickers/huginn/presenting-neutral.svg b/cast/stickers/huginn/presenting-neutral.svg
new file mode 100644
index 0000000..f82f3d0
--- /dev/null
+++ b/cast/stickers/huginn/presenting-neutral.svg
@@ -0,0 +1 @@
+Huginn — presenting, neutral
diff --git a/cast/stickers/huginn/presenting-sleepy.svg b/cast/stickers/huginn/presenting-sleepy.svg
new file mode 100644
index 0000000..79bd482
--- /dev/null
+++ b/cast/stickers/huginn/presenting-sleepy.svg
@@ -0,0 +1 @@
+Huginn — presenting, sleepy z z
diff --git a/cast/stickers/huginn/presenting-smile.svg b/cast/stickers/huginn/presenting-smile.svg
new file mode 100644
index 0000000..b104e4f
--- /dev/null
+++ b/cast/stickers/huginn/presenting-smile.svg
@@ -0,0 +1 @@
+Huginn — presenting, smile
diff --git a/cast/stickers/huginn/presenting-surprised.svg b/cast/stickers/huginn/presenting-surprised.svg
new file mode 100644
index 0000000..fb383eb
--- /dev/null
+++ b/cast/stickers/huginn/presenting-surprised.svg
@@ -0,0 +1 @@
+Huginn — presenting, surprised
diff --git a/cast/stickers/huginn/presenting-worried.svg b/cast/stickers/huginn/presenting-worried.svg
new file mode 100644
index 0000000..cfa21a0
--- /dev/null
+++ b/cast/stickers/huginn/presenting-worried.svg
@@ -0,0 +1 @@
+Huginn — presenting, worried
diff --git a/cast/stickers/huginn/surprised-determined.svg b/cast/stickers/huginn/surprised-determined.svg
new file mode 100644
index 0000000..83202a9
--- /dev/null
+++ b/cast/stickers/huginn/surprised-determined.svg
@@ -0,0 +1 @@
+Huginn — surprised, determined
diff --git a/cast/stickers/huginn/surprised-grin.svg b/cast/stickers/huginn/surprised-grin.svg
new file mode 100644
index 0000000..b099415
--- /dev/null
+++ b/cast/stickers/huginn/surprised-grin.svg
@@ -0,0 +1 @@
+Huginn — surprised, grin
diff --git a/cast/stickers/huginn/surprised-happy.svg b/cast/stickers/huginn/surprised-happy.svg
new file mode 100644
index 0000000..a2d23fc
--- /dev/null
+++ b/cast/stickers/huginn/surprised-happy.svg
@@ -0,0 +1 @@
+Huginn — surprised, happy
diff --git a/cast/stickers/huginn/surprised-neutral.svg b/cast/stickers/huginn/surprised-neutral.svg
new file mode 100644
index 0000000..5044b8b
--- /dev/null
+++ b/cast/stickers/huginn/surprised-neutral.svg
@@ -0,0 +1 @@
+Huginn — surprised, neutral
diff --git a/cast/stickers/huginn/surprised-sleepy.svg b/cast/stickers/huginn/surprised-sleepy.svg
new file mode 100644
index 0000000..65ee554
--- /dev/null
+++ b/cast/stickers/huginn/surprised-sleepy.svg
@@ -0,0 +1 @@
+Huginn — surprised, sleepy z z
diff --git a/cast/stickers/huginn/surprised-smile.svg b/cast/stickers/huginn/surprised-smile.svg
new file mode 100644
index 0000000..c909296
--- /dev/null
+++ b/cast/stickers/huginn/surprised-smile.svg
@@ -0,0 +1 @@
+Huginn — surprised, smile
diff --git a/cast/stickers/huginn/surprised-surprised.svg b/cast/stickers/huginn/surprised-surprised.svg
new file mode 100644
index 0000000..acc4796
--- /dev/null
+++ b/cast/stickers/huginn/surprised-surprised.svg
@@ -0,0 +1 @@
+Huginn — surprised, surprised
diff --git a/cast/stickers/huginn/surprised-worried.svg b/cast/stickers/huginn/surprised-worried.svg
new file mode 100644
index 0000000..2e0f1eb
--- /dev/null
+++ b/cast/stickers/huginn/surprised-worried.svg
@@ -0,0 +1 @@
+Huginn — surprised, worried
diff --git a/cast/stickers/huginn/thinking-determined.svg b/cast/stickers/huginn/thinking-determined.svg
new file mode 100644
index 0000000..3ae64ec
--- /dev/null
+++ b/cast/stickers/huginn/thinking-determined.svg
@@ -0,0 +1 @@
+Huginn — thinking, determined
diff --git a/cast/stickers/huginn/thinking-grin.svg b/cast/stickers/huginn/thinking-grin.svg
new file mode 100644
index 0000000..6e57b52
--- /dev/null
+++ b/cast/stickers/huginn/thinking-grin.svg
@@ -0,0 +1 @@
+Huginn — thinking, grin
diff --git a/cast/stickers/huginn/thinking-happy.svg b/cast/stickers/huginn/thinking-happy.svg
new file mode 100644
index 0000000..9968554
--- /dev/null
+++ b/cast/stickers/huginn/thinking-happy.svg
@@ -0,0 +1 @@
+Huginn — thinking, happy
diff --git a/cast/stickers/huginn/thinking-neutral.svg b/cast/stickers/huginn/thinking-neutral.svg
new file mode 100644
index 0000000..95621c9
--- /dev/null
+++ b/cast/stickers/huginn/thinking-neutral.svg
@@ -0,0 +1 @@
+Huginn — thinking, neutral
diff --git a/cast/stickers/huginn/thinking-sleepy.svg b/cast/stickers/huginn/thinking-sleepy.svg
new file mode 100644
index 0000000..6db0472
--- /dev/null
+++ b/cast/stickers/huginn/thinking-sleepy.svg
@@ -0,0 +1 @@
+Huginn — thinking, sleepy z z
diff --git a/cast/stickers/huginn/thinking-smile.svg b/cast/stickers/huginn/thinking-smile.svg
new file mode 100644
index 0000000..4a99fcf
--- /dev/null
+++ b/cast/stickers/huginn/thinking-smile.svg
@@ -0,0 +1 @@
+Huginn — thinking, smile
diff --git a/cast/stickers/huginn/thinking-surprised.svg b/cast/stickers/huginn/thinking-surprised.svg
new file mode 100644
index 0000000..7d924c6
--- /dev/null
+++ b/cast/stickers/huginn/thinking-surprised.svg
@@ -0,0 +1 @@
+Huginn — thinking, surprised
diff --git a/cast/stickers/huginn/thinking-worried.svg b/cast/stickers/huginn/thinking-worried.svg
new file mode 100644
index 0000000..7cc3f60
--- /dev/null
+++ b/cast/stickers/huginn/thinking-worried.svg
@@ -0,0 +1 @@
+Huginn — thinking, worried
diff --git a/cast/stickers/huginn/waving-determined.svg b/cast/stickers/huginn/waving-determined.svg
new file mode 100644
index 0000000..b98167d
--- /dev/null
+++ b/cast/stickers/huginn/waving-determined.svg
@@ -0,0 +1 @@
+Huginn — waving, determined
diff --git a/cast/stickers/huginn/waving-grin.svg b/cast/stickers/huginn/waving-grin.svg
new file mode 100644
index 0000000..dd6aa9e
--- /dev/null
+++ b/cast/stickers/huginn/waving-grin.svg
@@ -0,0 +1 @@
+Huginn — waving, grin
diff --git a/cast/stickers/huginn/waving-happy.svg b/cast/stickers/huginn/waving-happy.svg
new file mode 100644
index 0000000..1789714
--- /dev/null
+++ b/cast/stickers/huginn/waving-happy.svg
@@ -0,0 +1 @@
+Huginn — waving, happy
diff --git a/cast/stickers/huginn/waving-neutral.svg b/cast/stickers/huginn/waving-neutral.svg
new file mode 100644
index 0000000..55c22a0
--- /dev/null
+++ b/cast/stickers/huginn/waving-neutral.svg
@@ -0,0 +1 @@
+Huginn — waving, neutral
diff --git a/cast/stickers/huginn/waving-sleepy.svg b/cast/stickers/huginn/waving-sleepy.svg
new file mode 100644
index 0000000..ddbfbfe
--- /dev/null
+++ b/cast/stickers/huginn/waving-sleepy.svg
@@ -0,0 +1 @@
+Huginn — waving, sleepy z z
diff --git a/cast/stickers/huginn/waving-smile.svg b/cast/stickers/huginn/waving-smile.svg
new file mode 100644
index 0000000..840ba83
--- /dev/null
+++ b/cast/stickers/huginn/waving-smile.svg
@@ -0,0 +1 @@
+Huginn — waving, smile
diff --git a/cast/stickers/huginn/waving-surprised.svg b/cast/stickers/huginn/waving-surprised.svg
new file mode 100644
index 0000000..9c618a4
--- /dev/null
+++ b/cast/stickers/huginn/waving-surprised.svg
@@ -0,0 +1 @@
+Huginn — waving, surprised
diff --git a/cast/stickers/huginn/waving-worried.svg b/cast/stickers/huginn/waving-worried.svg
new file mode 100644
index 0000000..7c434e5
--- /dev/null
+++ b/cast/stickers/huginn/waving-worried.svg
@@ -0,0 +1 @@
+Huginn — waving, worried
diff --git a/cast/stickers/kiko/neutral-grin.svg b/cast/stickers/kiko/neutral-grin.svg
new file mode 100644
index 0000000..76a7b00
--- /dev/null
+++ b/cast/stickers/kiko/neutral-grin.svg
@@ -0,0 +1 @@
+Kiko — neutral, grin
diff --git a/cast/stickers/kiko/neutral-smile.svg b/cast/stickers/kiko/neutral-smile.svg
new file mode 100644
index 0000000..45e03d9
--- /dev/null
+++ b/cast/stickers/kiko/neutral-smile.svg
@@ -0,0 +1 @@
+Kiko — neutral, smile
diff --git a/cast/stickers/kiko/neutral-surprised.svg b/cast/stickers/kiko/neutral-surprised.svg
new file mode 100644
index 0000000..ed8c4c8
--- /dev/null
+++ b/cast/stickers/kiko/neutral-surprised.svg
@@ -0,0 +1 @@
+Kiko — neutral, surprised
diff --git a/cast/stickers/libby/cheer-determined.svg b/cast/stickers/libby/cheer-determined.svg
new file mode 100644
index 0000000..a893ead
--- /dev/null
+++ b/cast/stickers/libby/cheer-determined.svg
@@ -0,0 +1 @@
+Libby — cheer, determined
diff --git a/cast/stickers/libby/cheer-grin.svg b/cast/stickers/libby/cheer-grin.svg
new file mode 100644
index 0000000..132ffb8
--- /dev/null
+++ b/cast/stickers/libby/cheer-grin.svg
@@ -0,0 +1 @@
+Libby — cheer, grin
diff --git a/cast/stickers/libby/cheer-happy.svg b/cast/stickers/libby/cheer-happy.svg
new file mode 100644
index 0000000..8559e4c
--- /dev/null
+++ b/cast/stickers/libby/cheer-happy.svg
@@ -0,0 +1 @@
+Libby — cheer, happy
diff --git a/cast/stickers/libby/cheer-neutral.svg b/cast/stickers/libby/cheer-neutral.svg
new file mode 100644
index 0000000..fa44ddc
--- /dev/null
+++ b/cast/stickers/libby/cheer-neutral.svg
@@ -0,0 +1 @@
+Libby — cheer, neutral
diff --git a/cast/stickers/libby/cheer-sleepy.svg b/cast/stickers/libby/cheer-sleepy.svg
new file mode 100644
index 0000000..1eb5929
--- /dev/null
+++ b/cast/stickers/libby/cheer-sleepy.svg
@@ -0,0 +1 @@
+Libby — cheer, sleepy z z
diff --git a/cast/stickers/libby/cheer-smile.svg b/cast/stickers/libby/cheer-smile.svg
new file mode 100644
index 0000000..05d9018
--- /dev/null
+++ b/cast/stickers/libby/cheer-smile.svg
@@ -0,0 +1 @@
+Libby — cheer, smile
diff --git a/cast/stickers/libby/cheer-surprised.svg b/cast/stickers/libby/cheer-surprised.svg
new file mode 100644
index 0000000..d55e456
--- /dev/null
+++ b/cast/stickers/libby/cheer-surprised.svg
@@ -0,0 +1 @@
+Libby — cheer, surprised
diff --git a/cast/stickers/libby/cheer-worried.svg b/cast/stickers/libby/cheer-worried.svg
new file mode 100644
index 0000000..e462381
--- /dev/null
+++ b/cast/stickers/libby/cheer-worried.svg
@@ -0,0 +1 @@
+Libby — cheer, worried
diff --git a/cast/stickers/libby/neutral-determined.svg b/cast/stickers/libby/neutral-determined.svg
new file mode 100644
index 0000000..88e6e2f
--- /dev/null
+++ b/cast/stickers/libby/neutral-determined.svg
@@ -0,0 +1 @@
+Libby — neutral, determined
diff --git a/cast/stickers/libby/neutral-grin.svg b/cast/stickers/libby/neutral-grin.svg
new file mode 100644
index 0000000..f181158
--- /dev/null
+++ b/cast/stickers/libby/neutral-grin.svg
@@ -0,0 +1 @@
+Libby — neutral, grin
diff --git a/cast/stickers/libby/neutral-happy.svg b/cast/stickers/libby/neutral-happy.svg
new file mode 100644
index 0000000..b61c0f3
--- /dev/null
+++ b/cast/stickers/libby/neutral-happy.svg
@@ -0,0 +1 @@
+Libby — neutral, happy
diff --git a/cast/stickers/libby/neutral-neutral.svg b/cast/stickers/libby/neutral-neutral.svg
new file mode 100644
index 0000000..6c5c93c
--- /dev/null
+++ b/cast/stickers/libby/neutral-neutral.svg
@@ -0,0 +1 @@
+Libby — neutral, neutral
diff --git a/cast/stickers/libby/neutral-sleepy.svg b/cast/stickers/libby/neutral-sleepy.svg
new file mode 100644
index 0000000..c56e551
--- /dev/null
+++ b/cast/stickers/libby/neutral-sleepy.svg
@@ -0,0 +1 @@
+Libby — neutral, sleepy z z
diff --git a/cast/stickers/libby/neutral-smile.svg b/cast/stickers/libby/neutral-smile.svg
new file mode 100644
index 0000000..5557ad0
--- /dev/null
+++ b/cast/stickers/libby/neutral-smile.svg
@@ -0,0 +1 @@
+Libby — neutral, smile
diff --git a/cast/stickers/libby/neutral-surprised.svg b/cast/stickers/libby/neutral-surprised.svg
new file mode 100644
index 0000000..6a843fb
--- /dev/null
+++ b/cast/stickers/libby/neutral-surprised.svg
@@ -0,0 +1 @@
+Libby — neutral, surprised
diff --git a/cast/stickers/libby/neutral-worried.svg b/cast/stickers/libby/neutral-worried.svg
new file mode 100644
index 0000000..7b5f066
--- /dev/null
+++ b/cast/stickers/libby/neutral-worried.svg
@@ -0,0 +1 @@
+Libby — neutral, worried
diff --git a/cast/stickers/libby/presenting-determined.svg b/cast/stickers/libby/presenting-determined.svg
new file mode 100644
index 0000000..f1a7be7
--- /dev/null
+++ b/cast/stickers/libby/presenting-determined.svg
@@ -0,0 +1 @@
+Libby — presenting, determined
diff --git a/cast/stickers/libby/presenting-grin.svg b/cast/stickers/libby/presenting-grin.svg
new file mode 100644
index 0000000..d451876
--- /dev/null
+++ b/cast/stickers/libby/presenting-grin.svg
@@ -0,0 +1 @@
+Libby — presenting, grin
diff --git a/cast/stickers/libby/presenting-happy.svg b/cast/stickers/libby/presenting-happy.svg
new file mode 100644
index 0000000..8f7679c
--- /dev/null
+++ b/cast/stickers/libby/presenting-happy.svg
@@ -0,0 +1 @@
+Libby — presenting, happy
diff --git a/cast/stickers/libby/presenting-neutral.svg b/cast/stickers/libby/presenting-neutral.svg
new file mode 100644
index 0000000..4e8e5d2
--- /dev/null
+++ b/cast/stickers/libby/presenting-neutral.svg
@@ -0,0 +1 @@
+Libby — presenting, neutral
diff --git a/cast/stickers/libby/presenting-sleepy.svg b/cast/stickers/libby/presenting-sleepy.svg
new file mode 100644
index 0000000..a25f5ca
--- /dev/null
+++ b/cast/stickers/libby/presenting-sleepy.svg
@@ -0,0 +1 @@
+Libby — presenting, sleepy z z
diff --git a/cast/stickers/libby/presenting-smile.svg b/cast/stickers/libby/presenting-smile.svg
new file mode 100644
index 0000000..c8e5992
--- /dev/null
+++ b/cast/stickers/libby/presenting-smile.svg
@@ -0,0 +1 @@
+Libby — presenting, smile
diff --git a/cast/stickers/libby/presenting-surprised.svg b/cast/stickers/libby/presenting-surprised.svg
new file mode 100644
index 0000000..67c8344
--- /dev/null
+++ b/cast/stickers/libby/presenting-surprised.svg
@@ -0,0 +1 @@
+Libby — presenting, surprised
diff --git a/cast/stickers/libby/presenting-worried.svg b/cast/stickers/libby/presenting-worried.svg
new file mode 100644
index 0000000..5dde429
--- /dev/null
+++ b/cast/stickers/libby/presenting-worried.svg
@@ -0,0 +1 @@
+Libby — presenting, worried
diff --git a/cast/stickers/libby/surprised-determined.svg b/cast/stickers/libby/surprised-determined.svg
new file mode 100644
index 0000000..62c5924
--- /dev/null
+++ b/cast/stickers/libby/surprised-determined.svg
@@ -0,0 +1 @@
+Libby — surprised, determined
diff --git a/cast/stickers/libby/surprised-grin.svg b/cast/stickers/libby/surprised-grin.svg
new file mode 100644
index 0000000..e338a01
--- /dev/null
+++ b/cast/stickers/libby/surprised-grin.svg
@@ -0,0 +1 @@
+Libby — surprised, grin
diff --git a/cast/stickers/libby/surprised-happy.svg b/cast/stickers/libby/surprised-happy.svg
new file mode 100644
index 0000000..2fd28b4
--- /dev/null
+++ b/cast/stickers/libby/surprised-happy.svg
@@ -0,0 +1 @@
+Libby — surprised, happy
diff --git a/cast/stickers/libby/surprised-neutral.svg b/cast/stickers/libby/surprised-neutral.svg
new file mode 100644
index 0000000..195ebb4
--- /dev/null
+++ b/cast/stickers/libby/surprised-neutral.svg
@@ -0,0 +1 @@
+Libby — surprised, neutral
diff --git a/cast/stickers/libby/surprised-sleepy.svg b/cast/stickers/libby/surprised-sleepy.svg
new file mode 100644
index 0000000..7822a8d
--- /dev/null
+++ b/cast/stickers/libby/surprised-sleepy.svg
@@ -0,0 +1 @@
+Libby — surprised, sleepy z z
diff --git a/cast/stickers/libby/surprised-smile.svg b/cast/stickers/libby/surprised-smile.svg
new file mode 100644
index 0000000..090249d
--- /dev/null
+++ b/cast/stickers/libby/surprised-smile.svg
@@ -0,0 +1 @@
+Libby — surprised, smile
diff --git a/cast/stickers/libby/surprised-surprised.svg b/cast/stickers/libby/surprised-surprised.svg
new file mode 100644
index 0000000..99a75d2
--- /dev/null
+++ b/cast/stickers/libby/surprised-surprised.svg
@@ -0,0 +1 @@
+Libby — surprised, surprised
diff --git a/cast/stickers/libby/surprised-worried.svg b/cast/stickers/libby/surprised-worried.svg
new file mode 100644
index 0000000..e4105d6
--- /dev/null
+++ b/cast/stickers/libby/surprised-worried.svg
@@ -0,0 +1 @@
+Libby — surprised, worried
diff --git a/cast/stickers/libby/thinking-determined.svg b/cast/stickers/libby/thinking-determined.svg
new file mode 100644
index 0000000..9fe09e3
--- /dev/null
+++ b/cast/stickers/libby/thinking-determined.svg
@@ -0,0 +1 @@
+Libby — thinking, determined
diff --git a/cast/stickers/libby/thinking-grin.svg b/cast/stickers/libby/thinking-grin.svg
new file mode 100644
index 0000000..5ca828b
--- /dev/null
+++ b/cast/stickers/libby/thinking-grin.svg
@@ -0,0 +1 @@
+Libby — thinking, grin
diff --git a/cast/stickers/libby/thinking-happy.svg b/cast/stickers/libby/thinking-happy.svg
new file mode 100644
index 0000000..3171d2f
--- /dev/null
+++ b/cast/stickers/libby/thinking-happy.svg
@@ -0,0 +1 @@
+Libby — thinking, happy
diff --git a/cast/stickers/libby/thinking-neutral.svg b/cast/stickers/libby/thinking-neutral.svg
new file mode 100644
index 0000000..cd98411
--- /dev/null
+++ b/cast/stickers/libby/thinking-neutral.svg
@@ -0,0 +1 @@
+Libby — thinking, neutral
diff --git a/cast/stickers/libby/thinking-sleepy.svg b/cast/stickers/libby/thinking-sleepy.svg
new file mode 100644
index 0000000..7f7f600
--- /dev/null
+++ b/cast/stickers/libby/thinking-sleepy.svg
@@ -0,0 +1 @@
+Libby — thinking, sleepy z z
diff --git a/cast/stickers/libby/thinking-smile.svg b/cast/stickers/libby/thinking-smile.svg
new file mode 100644
index 0000000..ea8b3d6
--- /dev/null
+++ b/cast/stickers/libby/thinking-smile.svg
@@ -0,0 +1 @@
+Libby — thinking, smile
diff --git a/cast/stickers/libby/thinking-surprised.svg b/cast/stickers/libby/thinking-surprised.svg
new file mode 100644
index 0000000..3d09cc2
--- /dev/null
+++ b/cast/stickers/libby/thinking-surprised.svg
@@ -0,0 +1 @@
+Libby — thinking, surprised
diff --git a/cast/stickers/libby/thinking-worried.svg b/cast/stickers/libby/thinking-worried.svg
new file mode 100644
index 0000000..8a4c7ef
--- /dev/null
+++ b/cast/stickers/libby/thinking-worried.svg
@@ -0,0 +1 @@
+Libby — thinking, worried
diff --git a/cast/stickers/libby/waving-determined.svg b/cast/stickers/libby/waving-determined.svg
new file mode 100644
index 0000000..5e40326
--- /dev/null
+++ b/cast/stickers/libby/waving-determined.svg
@@ -0,0 +1 @@
+Libby — waving, determined
diff --git a/cast/stickers/libby/waving-grin.svg b/cast/stickers/libby/waving-grin.svg
new file mode 100644
index 0000000..6452626
--- /dev/null
+++ b/cast/stickers/libby/waving-grin.svg
@@ -0,0 +1 @@
+Libby — waving, grin
diff --git a/cast/stickers/libby/waving-happy.svg b/cast/stickers/libby/waving-happy.svg
new file mode 100644
index 0000000..27b43ed
--- /dev/null
+++ b/cast/stickers/libby/waving-happy.svg
@@ -0,0 +1 @@
+Libby — waving, happy
diff --git a/cast/stickers/libby/waving-neutral.svg b/cast/stickers/libby/waving-neutral.svg
new file mode 100644
index 0000000..1418fd4
--- /dev/null
+++ b/cast/stickers/libby/waving-neutral.svg
@@ -0,0 +1 @@
+Libby — waving, neutral
diff --git a/cast/stickers/libby/waving-sleepy.svg b/cast/stickers/libby/waving-sleepy.svg
new file mode 100644
index 0000000..3abb83f
--- /dev/null
+++ b/cast/stickers/libby/waving-sleepy.svg
@@ -0,0 +1 @@
+Libby — waving, sleepy z z
diff --git a/cast/stickers/libby/waving-smile.svg b/cast/stickers/libby/waving-smile.svg
new file mode 100644
index 0000000..9803460
--- /dev/null
+++ b/cast/stickers/libby/waving-smile.svg
@@ -0,0 +1 @@
+Libby — waving, smile
diff --git a/cast/stickers/libby/waving-surprised.svg b/cast/stickers/libby/waving-surprised.svg
new file mode 100644
index 0000000..b577cf9
--- /dev/null
+++ b/cast/stickers/libby/waving-surprised.svg
@@ -0,0 +1 @@
+Libby — waving, surprised
diff --git a/cast/stickers/libby/waving-worried.svg b/cast/stickers/libby/waving-worried.svg
new file mode 100644
index 0000000..7f94301
--- /dev/null
+++ b/cast/stickers/libby/waving-worried.svg
@@ -0,0 +1 @@
+Libby — waving, worried
diff --git a/cast/stickers/metame/neutral-grin.svg b/cast/stickers/metame/neutral-grin.svg
new file mode 100644
index 0000000..ee0f1d2
--- /dev/null
+++ b/cast/stickers/metame/neutral-grin.svg
@@ -0,0 +1 @@
+Metame — neutral, grin
diff --git a/cast/stickers/metame/neutral-smile.svg b/cast/stickers/metame/neutral-smile.svg
new file mode 100644
index 0000000..7cc20ad
--- /dev/null
+++ b/cast/stickers/metame/neutral-smile.svg
@@ -0,0 +1 @@
+Metame — neutral, smile
diff --git a/cast/stickers/metame/neutral-surprised.svg b/cast/stickers/metame/neutral-surprised.svg
new file mode 100644
index 0000000..631b916
--- /dev/null
+++ b/cast/stickers/metame/neutral-surprised.svg
@@ -0,0 +1 @@
+Metame — neutral, surprised
diff --git a/cast/stickers/mimir/neutral-grin.svg b/cast/stickers/mimir/neutral-grin.svg
new file mode 100644
index 0000000..b1d0450
--- /dev/null
+++ b/cast/stickers/mimir/neutral-grin.svg
@@ -0,0 +1 @@
+Mimir — neutral, grin
diff --git a/cast/stickers/mimir/neutral-smile.svg b/cast/stickers/mimir/neutral-smile.svg
new file mode 100644
index 0000000..e7e094e
--- /dev/null
+++ b/cast/stickers/mimir/neutral-smile.svg
@@ -0,0 +1 @@
+Mimir — neutral, smile
diff --git a/cast/stickers/mimir/neutral-surprised.svg b/cast/stickers/mimir/neutral-surprised.svg
new file mode 100644
index 0000000..0955091
--- /dev/null
+++ b/cast/stickers/mimir/neutral-surprised.svg
@@ -0,0 +1 @@
+Mimir — neutral, surprised
diff --git a/cast/stickers/muninn/neutral-grin.svg b/cast/stickers/muninn/neutral-grin.svg
new file mode 100644
index 0000000..1815166
--- /dev/null
+++ b/cast/stickers/muninn/neutral-grin.svg
@@ -0,0 +1 @@
+Muninn — neutral, grin
diff --git a/cast/stickers/muninn/neutral-smile.svg b/cast/stickers/muninn/neutral-smile.svg
new file mode 100644
index 0000000..8b346e0
--- /dev/null
+++ b/cast/stickers/muninn/neutral-smile.svg
@@ -0,0 +1 @@
+Muninn — neutral, smile
diff --git a/cast/stickers/muninn/neutral-surprised.svg b/cast/stickers/muninn/neutral-surprised.svg
new file mode 100644
index 0000000..ef710fd
--- /dev/null
+++ b/cast/stickers/muninn/neutral-surprised.svg
@@ -0,0 +1 @@
+Muninn — neutral, surprised
diff --git a/cast/stickers/nibu/neutral-grin.svg b/cast/stickers/nibu/neutral-grin.svg
new file mode 100644
index 0000000..79846b5
--- /dev/null
+++ b/cast/stickers/nibu/neutral-grin.svg
@@ -0,0 +1 @@
+Nibu — neutral, grin
diff --git a/cast/stickers/nibu/neutral-smile.svg b/cast/stickers/nibu/neutral-smile.svg
new file mode 100644
index 0000000..c6aeb61
--- /dev/null
+++ b/cast/stickers/nibu/neutral-smile.svg
@@ -0,0 +1 @@
+Nibu — neutral, smile
diff --git a/cast/stickers/nibu/neutral-surprised.svg b/cast/stickers/nibu/neutral-surprised.svg
new file mode 100644
index 0000000..01b33b2
--- /dev/null
+++ b/cast/stickers/nibu/neutral-surprised.svg
@@ -0,0 +1 @@
+Nibu — neutral, surprised
diff --git a/cast/stickers/norn/neutral-grin.svg b/cast/stickers/norn/neutral-grin.svg
new file mode 100644
index 0000000..e756594
--- /dev/null
+++ b/cast/stickers/norn/neutral-grin.svg
@@ -0,0 +1 @@
+Norn — neutral, grin
diff --git a/cast/stickers/norn/neutral-smile.svg b/cast/stickers/norn/neutral-smile.svg
new file mode 100644
index 0000000..3c307d5
--- /dev/null
+++ b/cast/stickers/norn/neutral-smile.svg
@@ -0,0 +1 @@
+Norn — neutral, smile
diff --git a/cast/stickers/norn/neutral-surprised.svg b/cast/stickers/norn/neutral-surprised.svg
new file mode 100644
index 0000000..9baecbf
--- /dev/null
+++ b/cast/stickers/norn/neutral-surprised.svg
@@ -0,0 +1 @@
+Norn — neutral, surprised
diff --git a/cast/stickers/sai/neutral-grin.svg b/cast/stickers/sai/neutral-grin.svg
new file mode 100644
index 0000000..1bc748c
--- /dev/null
+++ b/cast/stickers/sai/neutral-grin.svg
@@ -0,0 +1 @@
+Sai — neutral, grin
diff --git a/cast/stickers/sai/neutral-smile.svg b/cast/stickers/sai/neutral-smile.svg
new file mode 100644
index 0000000..79d6c72
--- /dev/null
+++ b/cast/stickers/sai/neutral-smile.svg
@@ -0,0 +1 @@
+Sai — neutral, smile
diff --git a/cast/stickers/sai/neutral-surprised.svg b/cast/stickers/sai/neutral-surprised.svg
new file mode 100644
index 0000000..5a69dec
--- /dev/null
+++ b/cast/stickers/sai/neutral-surprised.svg
@@ -0,0 +1 @@
+Sai — neutral, surprised
diff --git a/cast/stickers/sleipnir/neutral-grin.svg b/cast/stickers/sleipnir/neutral-grin.svg
new file mode 100644
index 0000000..f3c0f33
--- /dev/null
+++ b/cast/stickers/sleipnir/neutral-grin.svg
@@ -0,0 +1 @@
+Sleipnir — neutral, grin
diff --git a/cast/stickers/sleipnir/neutral-smile.svg b/cast/stickers/sleipnir/neutral-smile.svg
new file mode 100644
index 0000000..eaec9c3
--- /dev/null
+++ b/cast/stickers/sleipnir/neutral-smile.svg
@@ -0,0 +1 @@
+Sleipnir — neutral, smile
diff --git a/cast/stickers/sleipnir/neutral-surprised.svg b/cast/stickers/sleipnir/neutral-surprised.svg
new file mode 100644
index 0000000..cb965a1
--- /dev/null
+++ b/cast/stickers/sleipnir/neutral-surprised.svg
@@ -0,0 +1 @@
+Sleipnir — neutral, surprised
diff --git a/cast/stickers/tengu/neutral-grin.svg b/cast/stickers/tengu/neutral-grin.svg
new file mode 100644
index 0000000..fa37875
--- /dev/null
+++ b/cast/stickers/tengu/neutral-grin.svg
@@ -0,0 +1 @@
+Tengu — neutral, grin
diff --git a/cast/stickers/tengu/neutral-smile.svg b/cast/stickers/tengu/neutral-smile.svg
new file mode 100644
index 0000000..3c77153
--- /dev/null
+++ b/cast/stickers/tengu/neutral-smile.svg
@@ -0,0 +1 @@
+Tengu — neutral, smile
diff --git a/cast/stickers/tengu/neutral-surprised.svg b/cast/stickers/tengu/neutral-surprised.svg
new file mode 100644
index 0000000..2ef2a35
--- /dev/null
+++ b/cast/stickers/tengu/neutral-surprised.svg
@@ -0,0 +1 @@
+Tengu — neutral, surprised
diff --git a/cast/stickers/void/neutral-grin.svg b/cast/stickers/void/neutral-grin.svg
new file mode 100644
index 0000000..accc275
--- /dev/null
+++ b/cast/stickers/void/neutral-grin.svg
@@ -0,0 +1 @@
+Void — neutral, grin
diff --git a/cast/stickers/void/neutral-smile.svg b/cast/stickers/void/neutral-smile.svg
new file mode 100644
index 0000000..1dba0f1
--- /dev/null
+++ b/cast/stickers/void/neutral-smile.svg
@@ -0,0 +1 @@
+Void — neutral, smile
diff --git a/cast/stickers/void/neutral-surprised.svg b/cast/stickers/void/neutral-surprised.svg
new file mode 100644
index 0000000..992b42c
--- /dev/null
+++ b/cast/stickers/void/neutral-surprised.svg
@@ -0,0 +1 @@
+Void — neutral, surprised
diff --git a/cast/stickers/weksa/cheer-determined.svg b/cast/stickers/weksa/cheer-determined.svg
new file mode 100644
index 0000000..ac34c1a
--- /dev/null
+++ b/cast/stickers/weksa/cheer-determined.svg
@@ -0,0 +1 @@
+Weksa — cheer, determined
diff --git a/cast/stickers/weksa/cheer-grin.svg b/cast/stickers/weksa/cheer-grin.svg
new file mode 100644
index 0000000..1d1cbc0
--- /dev/null
+++ b/cast/stickers/weksa/cheer-grin.svg
@@ -0,0 +1 @@
+Weksa — cheer, grin
diff --git a/cast/stickers/weksa/cheer-happy.svg b/cast/stickers/weksa/cheer-happy.svg
new file mode 100644
index 0000000..fda0dc0
--- /dev/null
+++ b/cast/stickers/weksa/cheer-happy.svg
@@ -0,0 +1 @@
+Weksa — cheer, happy
diff --git a/cast/stickers/weksa/cheer-neutral.svg b/cast/stickers/weksa/cheer-neutral.svg
new file mode 100644
index 0000000..20fd33d
--- /dev/null
+++ b/cast/stickers/weksa/cheer-neutral.svg
@@ -0,0 +1 @@
+Weksa — cheer, neutral
diff --git a/cast/stickers/weksa/cheer-sleepy.svg b/cast/stickers/weksa/cheer-sleepy.svg
new file mode 100644
index 0000000..93e5b1c
--- /dev/null
+++ b/cast/stickers/weksa/cheer-sleepy.svg
@@ -0,0 +1 @@
+Weksa — cheer, sleepy z z
diff --git a/cast/stickers/weksa/cheer-smile.svg b/cast/stickers/weksa/cheer-smile.svg
new file mode 100644
index 0000000..32e1837
--- /dev/null
+++ b/cast/stickers/weksa/cheer-smile.svg
@@ -0,0 +1 @@
+Weksa — cheer, smile
diff --git a/cast/stickers/weksa/cheer-surprised.svg b/cast/stickers/weksa/cheer-surprised.svg
new file mode 100644
index 0000000..ce45940
--- /dev/null
+++ b/cast/stickers/weksa/cheer-surprised.svg
@@ -0,0 +1 @@
+Weksa — cheer, surprised
diff --git a/cast/stickers/weksa/cheer-worried.svg b/cast/stickers/weksa/cheer-worried.svg
new file mode 100644
index 0000000..5b4305f
--- /dev/null
+++ b/cast/stickers/weksa/cheer-worried.svg
@@ -0,0 +1 @@
+Weksa — cheer, worried
diff --git a/cast/stickers/weksa/neutral-determined.svg b/cast/stickers/weksa/neutral-determined.svg
new file mode 100644
index 0000000..796706b
--- /dev/null
+++ b/cast/stickers/weksa/neutral-determined.svg
@@ -0,0 +1 @@
+Weksa — neutral, determined
diff --git a/cast/stickers/weksa/neutral-grin.svg b/cast/stickers/weksa/neutral-grin.svg
new file mode 100644
index 0000000..f1bcf9e
--- /dev/null
+++ b/cast/stickers/weksa/neutral-grin.svg
@@ -0,0 +1 @@
+Weksa — neutral, grin
diff --git a/cast/stickers/weksa/neutral-happy.svg b/cast/stickers/weksa/neutral-happy.svg
new file mode 100644
index 0000000..3ce335f
--- /dev/null
+++ b/cast/stickers/weksa/neutral-happy.svg
@@ -0,0 +1 @@
+Weksa — neutral, happy
diff --git a/cast/stickers/weksa/neutral-neutral.svg b/cast/stickers/weksa/neutral-neutral.svg
new file mode 100644
index 0000000..96b2be1
--- /dev/null
+++ b/cast/stickers/weksa/neutral-neutral.svg
@@ -0,0 +1 @@
+Weksa — neutral, neutral
diff --git a/cast/stickers/weksa/neutral-sleepy.svg b/cast/stickers/weksa/neutral-sleepy.svg
new file mode 100644
index 0000000..463e31e
--- /dev/null
+++ b/cast/stickers/weksa/neutral-sleepy.svg
@@ -0,0 +1 @@
+Weksa — neutral, sleepy z z
diff --git a/cast/stickers/weksa/neutral-smile.svg b/cast/stickers/weksa/neutral-smile.svg
new file mode 100644
index 0000000..54b3470
--- /dev/null
+++ b/cast/stickers/weksa/neutral-smile.svg
@@ -0,0 +1 @@
+Weksa — neutral, smile
diff --git a/cast/stickers/weksa/neutral-surprised.svg b/cast/stickers/weksa/neutral-surprised.svg
new file mode 100644
index 0000000..4f7ec4a
--- /dev/null
+++ b/cast/stickers/weksa/neutral-surprised.svg
@@ -0,0 +1 @@
+Weksa — neutral, surprised
diff --git a/cast/stickers/weksa/neutral-worried.svg b/cast/stickers/weksa/neutral-worried.svg
new file mode 100644
index 0000000..99c8271
--- /dev/null
+++ b/cast/stickers/weksa/neutral-worried.svg
@@ -0,0 +1 @@
+Weksa — neutral, worried
diff --git a/cast/stickers/weksa/presenting-determined.svg b/cast/stickers/weksa/presenting-determined.svg
new file mode 100644
index 0000000..863ab75
--- /dev/null
+++ b/cast/stickers/weksa/presenting-determined.svg
@@ -0,0 +1 @@
+Weksa — presenting, determined
diff --git a/cast/stickers/weksa/presenting-grin.svg b/cast/stickers/weksa/presenting-grin.svg
new file mode 100644
index 0000000..f8e3bce
--- /dev/null
+++ b/cast/stickers/weksa/presenting-grin.svg
@@ -0,0 +1 @@
+Weksa — presenting, grin
diff --git a/cast/stickers/weksa/presenting-happy.svg b/cast/stickers/weksa/presenting-happy.svg
new file mode 100644
index 0000000..cbecd65
--- /dev/null
+++ b/cast/stickers/weksa/presenting-happy.svg
@@ -0,0 +1 @@
+Weksa — presenting, happy
diff --git a/cast/stickers/weksa/presenting-neutral.svg b/cast/stickers/weksa/presenting-neutral.svg
new file mode 100644
index 0000000..8133b1d
--- /dev/null
+++ b/cast/stickers/weksa/presenting-neutral.svg
@@ -0,0 +1 @@
+Weksa — presenting, neutral
diff --git a/cast/stickers/weksa/presenting-sleepy.svg b/cast/stickers/weksa/presenting-sleepy.svg
new file mode 100644
index 0000000..0f9f082
--- /dev/null
+++ b/cast/stickers/weksa/presenting-sleepy.svg
@@ -0,0 +1 @@
+Weksa — presenting, sleepy z z
diff --git a/cast/stickers/weksa/presenting-smile.svg b/cast/stickers/weksa/presenting-smile.svg
new file mode 100644
index 0000000..f481d9e
--- /dev/null
+++ b/cast/stickers/weksa/presenting-smile.svg
@@ -0,0 +1 @@
+Weksa — presenting, smile
diff --git a/cast/stickers/weksa/presenting-surprised.svg b/cast/stickers/weksa/presenting-surprised.svg
new file mode 100644
index 0000000..c321272
--- /dev/null
+++ b/cast/stickers/weksa/presenting-surprised.svg
@@ -0,0 +1 @@
+Weksa — presenting, surprised
diff --git a/cast/stickers/weksa/presenting-worried.svg b/cast/stickers/weksa/presenting-worried.svg
new file mode 100644
index 0000000..41994ec
--- /dev/null
+++ b/cast/stickers/weksa/presenting-worried.svg
@@ -0,0 +1 @@
+Weksa — presenting, worried
diff --git a/cast/stickers/weksa/surprised-determined.svg b/cast/stickers/weksa/surprised-determined.svg
new file mode 100644
index 0000000..47a40c8
--- /dev/null
+++ b/cast/stickers/weksa/surprised-determined.svg
@@ -0,0 +1 @@
+Weksa — surprised, determined
diff --git a/cast/stickers/weksa/surprised-grin.svg b/cast/stickers/weksa/surprised-grin.svg
new file mode 100644
index 0000000..2abaa05
--- /dev/null
+++ b/cast/stickers/weksa/surprised-grin.svg
@@ -0,0 +1 @@
+Weksa — surprised, grin
diff --git a/cast/stickers/weksa/surprised-happy.svg b/cast/stickers/weksa/surprised-happy.svg
new file mode 100644
index 0000000..434b072
--- /dev/null
+++ b/cast/stickers/weksa/surprised-happy.svg
@@ -0,0 +1 @@
+Weksa — surprised, happy
diff --git a/cast/stickers/weksa/surprised-neutral.svg b/cast/stickers/weksa/surprised-neutral.svg
new file mode 100644
index 0000000..ab2fed5
--- /dev/null
+++ b/cast/stickers/weksa/surprised-neutral.svg
@@ -0,0 +1 @@
+Weksa — surprised, neutral
diff --git a/cast/stickers/weksa/surprised-sleepy.svg b/cast/stickers/weksa/surprised-sleepy.svg
new file mode 100644
index 0000000..67f949d
--- /dev/null
+++ b/cast/stickers/weksa/surprised-sleepy.svg
@@ -0,0 +1 @@
+Weksa — surprised, sleepy z z
diff --git a/cast/stickers/weksa/surprised-smile.svg b/cast/stickers/weksa/surprised-smile.svg
new file mode 100644
index 0000000..b9f652d
--- /dev/null
+++ b/cast/stickers/weksa/surprised-smile.svg
@@ -0,0 +1 @@
+Weksa — surprised, smile
diff --git a/cast/stickers/weksa/surprised-surprised.svg b/cast/stickers/weksa/surprised-surprised.svg
new file mode 100644
index 0000000..9328c81
--- /dev/null
+++ b/cast/stickers/weksa/surprised-surprised.svg
@@ -0,0 +1 @@
+Weksa — surprised, surprised
diff --git a/cast/stickers/weksa/surprised-worried.svg b/cast/stickers/weksa/surprised-worried.svg
new file mode 100644
index 0000000..523aa39
--- /dev/null
+++ b/cast/stickers/weksa/surprised-worried.svg
@@ -0,0 +1 @@
+Weksa — surprised, worried
diff --git a/cast/stickers/weksa/thinking-determined.svg b/cast/stickers/weksa/thinking-determined.svg
new file mode 100644
index 0000000..31c4533
--- /dev/null
+++ b/cast/stickers/weksa/thinking-determined.svg
@@ -0,0 +1 @@
+Weksa — thinking, determined
diff --git a/cast/stickers/weksa/thinking-grin.svg b/cast/stickers/weksa/thinking-grin.svg
new file mode 100644
index 0000000..6f7b437
--- /dev/null
+++ b/cast/stickers/weksa/thinking-grin.svg
@@ -0,0 +1 @@
+Weksa — thinking, grin
diff --git a/cast/stickers/weksa/thinking-happy.svg b/cast/stickers/weksa/thinking-happy.svg
new file mode 100644
index 0000000..55c7bca
--- /dev/null
+++ b/cast/stickers/weksa/thinking-happy.svg
@@ -0,0 +1 @@
+Weksa — thinking, happy
diff --git a/cast/stickers/weksa/thinking-neutral.svg b/cast/stickers/weksa/thinking-neutral.svg
new file mode 100644
index 0000000..594536a
--- /dev/null
+++ b/cast/stickers/weksa/thinking-neutral.svg
@@ -0,0 +1 @@
+Weksa — thinking, neutral
diff --git a/cast/stickers/weksa/thinking-sleepy.svg b/cast/stickers/weksa/thinking-sleepy.svg
new file mode 100644
index 0000000..5317dc9
--- /dev/null
+++ b/cast/stickers/weksa/thinking-sleepy.svg
@@ -0,0 +1 @@
+Weksa — thinking, sleepy z z
diff --git a/cast/stickers/weksa/thinking-smile.svg b/cast/stickers/weksa/thinking-smile.svg
new file mode 100644
index 0000000..b8baf3a
--- /dev/null
+++ b/cast/stickers/weksa/thinking-smile.svg
@@ -0,0 +1 @@
+Weksa — thinking, smile
diff --git a/cast/stickers/weksa/thinking-surprised.svg b/cast/stickers/weksa/thinking-surprised.svg
new file mode 100644
index 0000000..35a67b2
--- /dev/null
+++ b/cast/stickers/weksa/thinking-surprised.svg
@@ -0,0 +1 @@
+Weksa — thinking, surprised
diff --git a/cast/stickers/weksa/thinking-worried.svg b/cast/stickers/weksa/thinking-worried.svg
new file mode 100644
index 0000000..092bcdc
--- /dev/null
+++ b/cast/stickers/weksa/thinking-worried.svg
@@ -0,0 +1 @@
+Weksa — thinking, worried
diff --git a/cast/stickers/weksa/waving-determined.svg b/cast/stickers/weksa/waving-determined.svg
new file mode 100644
index 0000000..07b8b5e
--- /dev/null
+++ b/cast/stickers/weksa/waving-determined.svg
@@ -0,0 +1 @@
+Weksa — waving, determined
diff --git a/cast/stickers/weksa/waving-grin.svg b/cast/stickers/weksa/waving-grin.svg
new file mode 100644
index 0000000..b998659
--- /dev/null
+++ b/cast/stickers/weksa/waving-grin.svg
@@ -0,0 +1 @@
+Weksa — waving, grin
diff --git a/cast/stickers/weksa/waving-happy.svg b/cast/stickers/weksa/waving-happy.svg
new file mode 100644
index 0000000..0df2150
--- /dev/null
+++ b/cast/stickers/weksa/waving-happy.svg
@@ -0,0 +1 @@
+Weksa — waving, happy
diff --git a/cast/stickers/weksa/waving-neutral.svg b/cast/stickers/weksa/waving-neutral.svg
new file mode 100644
index 0000000..d9e9ffb
--- /dev/null
+++ b/cast/stickers/weksa/waving-neutral.svg
@@ -0,0 +1 @@
+Weksa — waving, neutral
diff --git a/cast/stickers/weksa/waving-sleepy.svg b/cast/stickers/weksa/waving-sleepy.svg
new file mode 100644
index 0000000..254afc3
--- /dev/null
+++ b/cast/stickers/weksa/waving-sleepy.svg
@@ -0,0 +1 @@
+Weksa — waving, sleepy z z
diff --git a/cast/stickers/weksa/waving-smile.svg b/cast/stickers/weksa/waving-smile.svg
new file mode 100644
index 0000000..91fe330
--- /dev/null
+++ b/cast/stickers/weksa/waving-smile.svg
@@ -0,0 +1 @@
+Weksa — waving, smile
diff --git a/cast/stickers/weksa/waving-surprised.svg b/cast/stickers/weksa/waving-surprised.svg
new file mode 100644
index 0000000..23f905b
--- /dev/null
+++ b/cast/stickers/weksa/waving-surprised.svg
@@ -0,0 +1 @@
+Weksa — waving, surprised
diff --git a/cast/stickers/weksa/waving-worried.svg b/cast/stickers/weksa/waving-worried.svg
new file mode 100644
index 0000000..f386c22
--- /dev/null
+++ b/cast/stickers/weksa/waving-worried.svg
@@ -0,0 +1 @@
+Weksa — waving, worried
diff --git a/cast/stickers/ymir/neutral-grin.svg b/cast/stickers/ymir/neutral-grin.svg
new file mode 100644
index 0000000..5706963
--- /dev/null
+++ b/cast/stickers/ymir/neutral-grin.svg
@@ -0,0 +1 @@
+Ymir — neutral, grin
diff --git a/cast/stickers/ymir/neutral-smile.svg b/cast/stickers/ymir/neutral-smile.svg
new file mode 100644
index 0000000..bf4747b
--- /dev/null
+++ b/cast/stickers/ymir/neutral-smile.svg
@@ -0,0 +1 @@
+Ymir — neutral, smile
diff --git a/cast/stickers/ymir/neutral-surprised.svg b/cast/stickers/ymir/neutral-surprised.svg
new file mode 100644
index 0000000..b51720a
--- /dev/null
+++ b/cast/stickers/ymir/neutral-surprised.svg
@@ -0,0 +1 @@
+Ymir — neutral, surprised