xiv-strat-board 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -161,6 +161,10 @@ See `ICON_TYPE_IDS` export for the complete list.
161
161
 
162
162
  This package works in both Node.js and browsers. It uses `pako` for zlib compression, which is browser-compatible.
163
163
 
164
+ ## Special Thanks
165
+
166
+ Special thanks to @MinhP for reverse engineering work on the share code format and @ennea for an [awesome viewer implementation](https://ennea.github.io/ffxiv-strategy-board-viewer/).
167
+
164
168
  ## License
165
169
 
166
170
  MIT
package/dist/index.cjs CHANGED
@@ -809,10 +809,12 @@ function parseBinary(data) {
809
809
  obj.background = bgName ?? backgrounds[i];
810
810
  }
811
811
  const colorableTypes = /* @__PURE__ */ new Set([11, 12, 100]);
812
- if (colors[i] && colorableTypes.has(iconId)) {
812
+ if (colors[i]) {
813
813
  const { r, g, b, a } = colors[i];
814
- const hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
815
- obj.color = hex;
814
+ if (colorableTypes.has(iconId)) {
815
+ const hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
816
+ obj.color = hex;
817
+ }
816
818
  if (a > 0) {
817
819
  obj.transparency = a;
818
820
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/validation.ts","../src/binary.ts","../src/cipher.ts","../src/encoder.ts","../src/decoder.ts"],"names":["pako"],"mappings":"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AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC7D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC5D,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC7D,GAAA,EAA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","file":"index.cjs","sourcesContent":["/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher tables and icon/background mappings from game data.\r\n */\r\n\r\n/**\r\n * Cipher lookup table (DAT_1420cf520 from game binary).\r\n * Used to decode the key character in share codes.\r\n */\r\nexport const CIPHER_TABLE = new Uint8Array([\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 80, 0, 0,\r\n 120, 103, 48, 75, 56, 83, 74, 50, 115, 90, 0, 0, 0, 0, 0, 0,\r\n 0, 68, 70, 116, 84, 54, 69, 97, 86, 99, 112, 76, 77, 109, 101, 106,\r\n 57, 88, 66, 52, 82, 89, 55, 95, 110, 79, 98, 0, 0, 0, 0, 0,\r\n 0, 105, 45, 118, 72, 67, 65, 114, 87, 111, 100, 73, 113, 104, 85, 108,\r\n 107, 51, 102, 121, 53, 71, 119, 49, 117, 122, 81, 0, 0, 0, 0, 0,\r\n]);\r\n\r\n/**\r\n * Reverse mapping of CIPHER_TABLE for encoding.\r\n * Maps output character code -> input character code.\r\n */\r\nexport const KEY_REVERSE: Record<number, number> = {};\r\nfor (let i = 0; i < CIPHER_TABLE.length; i++) {\r\n if (CIPHER_TABLE[i] !== 0) {\r\n KEY_REVERSE[CIPHER_TABLE[i]] = i;\r\n }\r\n}\r\n\r\n/**\r\n * Inverse character substitution mapping.\r\n * Maps obfuscated character code -> standard Base64 character code.\r\n */\r\nexport const INVERSE_MAPPING: Record<number, number> = {\r\n 98: 45, 50: 48, 119: 49, 55: 50, 113: 51, 83: 52, 116: 53, 69: 54,\r\n 86: 55, 52: 56, 80: 57, 102: 65, 82: 66, 101: 67, 65: 68, 70: 69,\r\n 66: 70, 117: 71, 100: 72, 107: 73, 54: 74, 51: 75, 75: 76, 76: 77,\r\n 43: 78, 89: 79, 45: 80, 122: 81, 84: 82, 53: 83, 68: 84, 110: 85,\r\n 72: 86, 104: 87, 81: 88, 85: 89, 57: 90, 87: 95, 71: 97, 90: 98,\r\n 73: 99, 106: 100, 78: 101, 114: 102, 49: 103, 109: 104, 97: 105,\r\n 79: 106, 112: 107, 111: 108, 77: 109, 88: 110, 105: 111, 74: 112,\r\n 108: 113, 103: 114, 56: 115, 67: 116, 120: 117, 99: 118, 118: 119,\r\n 48: 120, 115: 121, 121: 122,\r\n};\r\n\r\n/**\r\n * Forward character substitution mapping (reverse of INVERSE_MAPPING).\r\n * Maps standard Base64 character code -> obfuscated character code.\r\n */\r\nexport const FORWARD_MAPPING: Record<number, number> = {};\r\nfor (const [k, v] of Object.entries(INVERSE_MAPPING)) {\r\n FORWARD_MAPPING[v] = Number(k);\r\n}\r\n\r\n/**\r\n * Icon type name to numeric ID mapping.\r\n * Complete list from stgy.csv game data.\r\n */\r\nexport const ICON_TYPE_IDS: Record<string, number> = {\r\n // Field backgrounds (type 1)\r\n checkered_circle: 4,\r\n checkered_square: 8,\r\n grey_circle: 124,\r\n grey_square: 125,\r\n\r\n // AoE/Mechanics (type 6)\r\n circle_aoe: 9,\r\n fan_aoe: 10,\r\n line_aoe: 11,\r\n line: 12,\r\n gaze: 13,\r\n stack: 14,\r\n line_stack: 15,\r\n proximity: 16,\r\n donut: 17,\r\n stack_multi: 106,\r\n proximity_player: 107,\r\n tankbuster: 108,\r\n radial_knockback: 109,\r\n linear_knockback: 110,\r\n tower: 111,\r\n targeting: 112,\r\n moving_circle_aoe: 126,\r\n '1person_aoe': 127,\r\n '2person_aoe': 128,\r\n '3person_aoe': 129,\r\n '4person_aoe': 130,\r\n\r\n // Base classes (type 2)\r\n gladiator: 18,\r\n pugilist: 19,\r\n marauder: 20,\r\n lancer: 21,\r\n archer: 22,\r\n conjurer: 23,\r\n thaumaturge: 24,\r\n arcanist: 25,\r\n rogue: 26,\r\n\r\n // Jobs (type 2)\r\n paladin: 27,\r\n monk: 28,\r\n warrior: 29,\r\n dragoon: 30,\r\n bard: 31,\r\n white_mage: 32,\r\n black_mage: 33,\r\n summoner: 34,\r\n scholar: 35,\r\n ninja: 36,\r\n machinist: 37,\r\n dark_knight: 38,\r\n astrologian: 39,\r\n samurai: 40,\r\n red_mage: 41,\r\n blue_mage: 42,\r\n gunbreaker: 43,\r\n dancer: 44,\r\n reaper: 45,\r\n sage: 46,\r\n viper: 101,\r\n pictomancer: 102,\r\n\r\n // Role markers (type 2)\r\n tank: 47,\r\n tank_1: 48,\r\n tank_2: 49,\r\n healer: 50,\r\n healer_1: 51,\r\n healer_2: 52,\r\n dps: 53,\r\n dps_1: 54,\r\n dps_2: 55,\r\n dps_3: 56,\r\n dps_4: 57,\r\n melee_dps: 118,\r\n ranged_dps: 119,\r\n physical_ranged_dps: 120,\r\n magical_ranged_dps: 121,\r\n pure_healer: 122,\r\n barrier_healer: 123,\r\n\r\n // Enemies (type 3)\r\n small_enemy: 60,\r\n medium_enemy: 62,\r\n large_enemy: 64,\r\n\r\n // Target markers (type 3)\r\n attack_1: 65,\r\n attack_2: 66,\r\n attack_3: 67,\r\n attack_4: 68,\r\n attack_5: 69,\r\n attack_6: 115,\r\n attack_7: 116,\r\n attack_8: 117,\r\n bind_1: 70,\r\n bind_2: 71,\r\n bind_3: 72,\r\n ignore_1: 73,\r\n ignore_2: 74,\r\n\r\n // Chain markers (type 3)\r\n square_marker: 75,\r\n circle_marker: 76,\r\n plus_marker: 77,\r\n triangle_marker: 78,\r\n\r\n // Waymarks (type 3)\r\n waymark_a: 79,\r\n waymark_b: 80,\r\n waymark_c: 81,\r\n waymark_d: 82,\r\n waymark_1: 83,\r\n waymark_2: 84,\r\n waymark_3: 85,\r\n waymark_4: 86,\r\n\r\n // Shapes (type 4)\r\n shape_circle: 87,\r\n shape_x: 88,\r\n shape_triangle: 89,\r\n shape_square: 90,\r\n up_arrow: 94,\r\n text: 100,\r\n rotate: 103,\r\n highlighted_circle: 135,\r\n highlighted_x: 136,\r\n highlighted_square: 137,\r\n highlighted_triangle: 138,\r\n rotate_clockwise: 139,\r\n rotate_counterclockwise: 140,\r\n\r\n // Effects (type 3)\r\n enhancement: 113,\r\n enfeeblement: 114,\r\n\r\n // Lock-on markers (type 3)\r\n lockon_red: 131,\r\n lockon_blue: 132,\r\n lockon_purple: 133,\r\n lockon_green: 134,\r\n\r\n // Groups (type 5)\r\n group: 105,\r\n};\r\n\r\n/**\r\n * Icon numeric ID to type name mapping (reverse of ICON_TYPE_IDS).\r\n */\r\nexport const ICON_TYPES: Record<number, string> = {};\r\nfor (const [name, id] of Object.entries(ICON_TYPE_IDS)) {\r\n ICON_TYPES[id] = name;\r\n}\r\n\r\n/**\r\n * Board background numeric ID to name mapping.\r\n * Used in Tag 3 footer.\r\n */\r\nexport const BOARD_BACKGROUND_TYPES: Record<number, string> = {\r\n 1: 'none',\r\n 2: 'checkered',\r\n 3: 'checkered_circle',\r\n 4: 'checkered_square',\r\n 5: 'grey',\r\n 6: 'grey_circle',\r\n 7: 'grey_square',\r\n};\r\n\r\n/**\r\n * Board background name to numeric ID mapping.\r\n */\r\nexport const BOARD_BACKGROUND_IDS: Record<string, number> = {\r\n none: 1,\r\n checkered: 2,\r\n checkered_circle: 3,\r\n checkered_square: 4,\r\n grey: 5,\r\n grey_circle: 6,\r\n grey_square: 7,\r\n};\r\n\r\n/**\r\n * Object background numeric ID to name mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_TYPES: Record<number, string> = {\r\n 0: 'none',\r\n 1: 'checkered',\r\n 2: 'checkered_circle',\r\n 3: 'checkered_square',\r\n 4: 'grey',\r\n 5: 'grey_circle',\r\n 6: 'grey_square',\r\n};\r\n\r\n/**\r\n * Object background name to numeric ID mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_IDS: Record<string, number> = {\r\n none: 0,\r\n checkered: 1,\r\n checkered_circle: 2,\r\n checkered_square: 3,\r\n grey: 4,\r\n grey_circle: 5,\r\n grey_square: 6,\r\n};\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Input validation and sanitization for secure public package usage.\r\n */\r\n\r\nimport type { StrategyBoard, StrategyObject } from './types';\r\nimport { ICON_TYPE_IDS, BOARD_BACKGROUND_IDS, OBJECT_BACKGROUND_IDS } from './constants';\r\n\r\n/**\r\n * Board coordinate and property bounds.\r\n */\r\nexport const BOUNDS = {\r\n /** Minimum X coordinate (allows slight overflow for edge objects) */\r\n minX: -100,\r\n /** Maximum X coordinate */\r\n maxX: 612,\r\n /** Minimum Y coordinate */\r\n minY: -100,\r\n /** Maximum Y coordinate */\r\n maxY: 484,\r\n /** Minimum size percentage */\r\n minSize: 1,\r\n /** Maximum size percentage */\r\n maxSize: 255,\r\n /** Minimum arc angle */\r\n minArc: 0,\r\n /** Maximum arc angle */\r\n maxArc: 360,\r\n /** Minimum donut radius */\r\n minDonut: 0,\r\n /** Maximum donut radius */\r\n maxDonut: 255,\r\n /** Maximum number of objects per board */\r\n maxObjects: 50,\r\n /** Maximum name length (bytes) */\r\n maxNameLength: 7,\r\n} as const;\r\n\r\n/**\r\n * Characters allowed in cipher-encoded body.\r\n */\r\nconst VALID_CIPHER_CHARS = new Set(\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-_'.split('')\r\n);\r\n\r\n/**\r\n * Validates the format of a share code string.\r\n *\r\n * @param code - The share code to validate\r\n * @throws {Error} If the share code format is invalid\r\n */\r\nexport function validateShareCode(code: string): void {\r\n if (typeof code !== 'string') {\r\n throw new Error('Share code must be a string');\r\n }\r\n\r\n if (code.length < 10) {\r\n throw new Error('Share code is too short');\r\n }\r\n\r\n if (code.length > 10000) {\r\n throw new Error('Share code is too long');\r\n }\r\n\r\n if (!code.startsWith('[stgy:a')) {\r\n throw new Error('Share code must start with \"[stgy:a\"');\r\n }\r\n\r\n if (!code.endsWith(']')) {\r\n throw new Error('Share code must end with \"]\"');\r\n }\r\n\r\n // Extract body (between [stgy:a and ])\r\n const body = code.slice(7, -1);\r\n\r\n if (body.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // Validate all characters in body\r\n for (const char of body) {\r\n if (!VALID_CIPHER_CHARS.has(char)) {\r\n throw new Error(`Invalid character in share code: \"${char}\"`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Clamps a number to a range.\r\n */\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a board name.\r\n * Only allows ASCII alphanumeric characters, truncates to max length.\r\n *\r\n * @param name - The name to sanitize\r\n * @returns Sanitized name\r\n */\r\nexport function sanitizeName(name: string | undefined): string {\r\n if (!name || typeof name !== 'string') {\r\n return 'board';\r\n }\r\n\r\n // Remove non-ASCII and control characters, keep alphanumeric and some safe chars\r\n const sanitized = name\r\n .replace(/[^\\x20-\\x7E]/g, '') // Only printable ASCII\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove filesystem-unsafe chars\r\n .trim()\r\n .slice(0, BOUNDS.maxNameLength);\r\n\r\n return sanitized || 'board';\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a coordinate value.\r\n *\r\n * @param value - The coordinate value\r\n * @param isX - Whether this is an X coordinate\r\n * @returns Sanitized coordinate\r\n */\r\nexport function sanitizeCoordinate(value: unknown, isX: boolean): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return isX ? 256 : 192; // Default to center\r\n }\r\n\r\n const min = isX ? BOUNDS.minX : BOUNDS.minY;\r\n const max = isX ? BOUNDS.maxX : BOUNDS.maxY;\r\n\r\n return clamp(Math.round(value * 10) / 10, min, max);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a size value.\r\n *\r\n * @param value - The size value\r\n * @returns Sanitized size (50-200 range, default 100)\r\n */\r\nexport function sanitizeSize(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 100;\r\n }\r\n return clamp(Math.round(value), BOUNDS.minSize, BOUNDS.maxSize);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a color component (0-255).\r\n */\r\nexport function sanitizeColorComponent(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 255;\r\n }\r\n return clamp(Math.round(value), 0, 255);\r\n}\r\n\r\n/**\r\n * Parses a hex color string to RGB components.\r\n *\r\n * @param color - Hex color string (e.g., '#FF0000' or 'FF0000')\r\n * @returns RGB components or null if invalid\r\n */\r\nexport function parseHexColor(color: string | undefined): { r: number; g: number; b: number } | null {\r\n if (!color || typeof color !== 'string') {\r\n return null;\r\n }\r\n\r\n // Remove # prefix if present\r\n const hex = color.replace(/^#/, '');\r\n\r\n // Validate hex format\r\n if (!/^[0-9A-Fa-f]{6}$/.test(hex)) {\r\n return null;\r\n }\r\n\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n}\r\n\r\n/**\r\n * Validates a background type value.\r\n */\r\nexport function validateBackground(value: unknown): number {\r\n if (typeof value === 'number') {\r\n if (value >= 0 && value <= 6) {\r\n return value;\r\n }\r\n return 0;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const id = OBJECT_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 0;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Validates a board background type value.\r\n */\r\nexport function validateBoardBackground(value: unknown): number {\r\n if (typeof value === 'string') {\r\n const id = BOARD_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 1;\r\n }\r\n\r\n if (typeof value === 'number' && value >= 1 && value <= 7) {\r\n return value;\r\n }\r\n\r\n return 1; // default: none\r\n}\r\n\r\n/**\r\n * Validates an icon type, returning the numeric ID.\r\n *\r\n * @param typeName - Icon type name or ID\r\n * @param typeId - Optional explicit type ID\r\n * @returns Numeric icon type ID\r\n * @throws {Error} If icon type is unknown\r\n */\r\nexport function validateIconType(typeName: string, typeId?: number): number {\r\n // Explicit typeId takes priority\r\n if (typeof typeId === 'number' && Number.isFinite(typeId) && typeId > 0 && typeId < 256) {\r\n return typeId;\r\n }\r\n\r\n // Look up by name\r\n const id = ICON_TYPE_IDS[typeName];\r\n if (id !== undefined) {\r\n return id;\r\n }\r\n\r\n // Try to parse as unknown_{id} format\r\n const unknownMatch = typeName.match(/^unknown_(\\d+)$/);\r\n if (unknownMatch) {\r\n const parsedId = parseInt(unknownMatch[1], 10);\r\n if (parsedId > 0 && parsedId < 256) {\r\n return parsedId;\r\n }\r\n }\r\n\r\n throw new Error(`Unknown icon type: \"${typeName}\"`);\r\n}\r\n\r\n/**\r\n * Sanitizes a single strategy object.\r\n *\r\n * @param obj - The object to sanitize\r\n * @param index - Object index for error messages\r\n * @returns Sanitized object data\r\n * @throws {Error} If object data is invalid\r\n */\r\nexport function sanitizeObject(\r\n obj: StrategyObject,\r\n index: number\r\n): {\r\n typeId: number;\r\n x: number;\r\n y: number;\r\n size: number;\r\n background: number;\r\n colorR: number;\r\n colorG: number;\r\n colorB: number;\r\n transparency: number;\r\n arcAngle: number;\r\n donutRadius: number;\r\n hidden: boolean;\r\n locked: boolean;\r\n} {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error(`Object at index ${index} is not a valid object`);\r\n }\r\n\r\n if (!obj.type && !obj.typeId) {\r\n throw new Error(`Object at index ${index} must have a type or typeId`);\r\n }\r\n\r\n const typeId = validateIconType(obj.type || '', obj.typeId);\r\n\r\n // Parse color from hex string or components\r\n let colorR = obj.colorR ?? 255;\r\n let colorG = obj.colorG ?? 255;\r\n let colorB = obj.colorB ?? 255;\r\n\r\n if (obj.color) {\r\n const parsed = parseHexColor(obj.color);\r\n if (parsed) {\r\n colorR = parsed.r;\r\n colorG = parsed.g;\r\n colorB = parsed.b;\r\n }\r\n }\r\n\r\n return {\r\n typeId,\r\n x: sanitizeCoordinate(obj.x, true),\r\n y: sanitizeCoordinate(obj.y, false),\r\n size: sanitizeSize(obj.size),\r\n background: validateBackground(obj.background),\r\n colorR: sanitizeColorComponent(colorR),\r\n colorG: sanitizeColorComponent(colorG),\r\n colorB: sanitizeColorComponent(colorB),\r\n transparency: sanitizeColorComponent(obj.transparency ?? 0),\r\n arcAngle: clamp(Math.round(obj.arcAngle ?? 0), BOUNDS.minArc, BOUNDS.maxArc),\r\n donutRadius: clamp(Math.round(obj.donutRadius ?? 0), BOUNDS.minDonut, BOUNDS.maxDonut),\r\n hidden: Boolean(obj.hidden),\r\n locked: Boolean(obj.locked),\r\n };\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a complete strategy board for encoding.\r\n *\r\n * @param board - The board to sanitize\r\n * @returns Sanitized board data ready for binary encoding\r\n * @throws {Error} If board data is invalid\r\n */\r\nexport function sanitizeBoard(board: StrategyBoard): {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n} {\r\n if (!board || typeof board !== 'object') {\r\n throw new Error('Board must be an object');\r\n }\r\n\r\n if (!Array.isArray(board.objects)) {\r\n throw new Error('Board must have an objects array');\r\n }\r\n\r\n if (board.objects.length > BOUNDS.maxObjects) {\r\n throw new Error(`Board has too many objects (max ${BOUNDS.maxObjects})`);\r\n }\r\n\r\n return {\r\n name: sanitizeName(board.name),\r\n boardBackground: validateBoardBackground(board.boardBackground),\r\n objects: board.objects.map((obj, i) => sanitizeObject(obj, i)),\r\n };\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Binary format builder and parser (TLV format).\r\n */\r\n\r\nimport type { DecodeResult, BackgroundType } from './types';\r\nimport {\r\n ICON_TYPES,\r\n BOARD_BACKGROUND_TYPES,\r\n OBJECT_BACKGROUND_TYPES,\r\n} from './constants';\r\nimport type { sanitizeObject } from './validation';\r\n\r\n/**\r\n * DataView wrapper for reading binary data with bounds checking.\r\n */\r\nclass BinaryReader {\r\n private view: DataView;\r\n private pos: number;\r\n\r\n constructor(data: Uint8Array) {\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.pos = 0;\r\n }\r\n\r\n get position(): number {\r\n return this.pos;\r\n }\r\n\r\n get length(): number {\r\n return this.view.byteLength;\r\n }\r\n\r\n get remaining(): number {\r\n return this.length - this.pos;\r\n }\r\n\r\n seek(pos: number): void {\r\n if (pos < 0 || pos > this.length) {\r\n throw new Error(`Seek position ${pos} out of bounds [0, ${this.length}]`);\r\n }\r\n this.pos = pos;\r\n }\r\n\r\n readUint8(): number {\r\n if (this.pos + 1 > this.length) {\r\n throw new Error('Unexpected end of data reading uint8');\r\n }\r\n const val = this.view.getUint8(this.pos);\r\n this.pos += 1;\r\n return val;\r\n }\r\n\r\n readInt16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading int16');\r\n }\r\n const val = this.view.getInt16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading uint16');\r\n }\r\n const val = this.view.getUint16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint32(): number {\r\n if (this.pos + 4 > this.length) {\r\n throw new Error('Unexpected end of data reading uint32');\r\n }\r\n const val = this.view.getUint32(this.pos, true); // little-endian\r\n this.pos += 4;\r\n return val;\r\n }\r\n\r\n readBytes(count: number): Uint8Array {\r\n if (this.pos + count > this.length) {\r\n throw new Error(`Unexpected end of data reading ${count} bytes`);\r\n }\r\n const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.pos, count);\r\n this.pos += count;\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Parses decompressed binary data into a strategy board structure.\r\n *\r\n * @param data - Decompressed binary data\r\n * @returns Parsed board structure\r\n * @throws {Error} If binary format is invalid\r\n */\r\nexport function parseBinary(data: Uint8Array): DecodeResult {\r\n if (data.length < 0x1C) {\r\n throw new Error('Binary data is too short for header');\r\n }\r\n\r\n const reader = new BinaryReader(data);\r\n\r\n // Parse header\r\n const version = reader.readUint32();\r\n\r\n // Skip fields at 0x04-0x17\r\n reader.seek(0x18);\r\n reader.readUint16(); // object_count_header (always 1)\r\n\r\n // Read name length at 0x1A\r\n const nameLength = reader.readUint16();\r\n\r\n if (data.length < 0x1C + nameLength) {\r\n throw new Error('Binary data is too short for name field');\r\n }\r\n\r\n // Read name at 0x1C with variable length\r\n const nameBytes = reader.readBytes(nameLength);\r\n const name = new TextDecoder('utf-8', { fatal: false })\r\n .decode(nameBytes)\r\n .replace(/\\0+$/, '')\r\n .trim();\r\n\r\n // Parse icon list (Tag 2 entries) with interleaved text content (Tag 3)\r\n // Text content appears immediately after text icons (iconId 100) in the stream\r\n const icons: number[] = [];\r\n const textContents: string[] = []; // Text content for text objects\r\n while (reader.remaining >= 4) {\r\n const marker = reader.readUint16();\r\n if (marker === 2) {\r\n // Icon entry\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (marker === 3) {\r\n // Tag 3: text content (length > 1) or footer indicator (length = 1)\r\n const val = reader.readUint16();\r\n if (val > 1) {\r\n // Text content - appears after text icon entries\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n } else {\r\n // Footer indicator (val === 1), rewind and let main loop handle it\r\n reader.seek(reader.position - 4);\r\n break;\r\n }\r\n } else {\r\n // Other tag, rewind and break to main tag parsing\r\n reader.seek(reader.position - 2);\r\n break;\r\n }\r\n }\r\n\r\n const n = icons.length;\r\n\r\n // Storage for object properties\r\n const positions: Array<{ x: number; y: number }> = [];\r\n const backgrounds: number[] = []; // Tag 6: also used for rotation angle in rotatable objects\r\n const sizes: number[] = [];\r\n const colors: Array<{ r: number; g: number; b: number; a: number }> = [];\r\n const tag10: number[] = []; // Tag 10: arc angle for fan_aoe, width for line_aoe, horiz count for knockback\r\n const tag11: number[] = []; // Tag 11: donut radius, height for line_aoe, vert count/display count\r\n const tag12: number[] = []; // Tag 12: reserved\r\n const objectFlags: number[] = []; // Per-object flags from Tag 4\r\n let boardBackground = 1; // default: none\r\n\r\n // Parse tags\r\n while (reader.remaining >= 2) {\r\n const tag = reader.readUint16();\r\n\r\n if (tag === 2) {\r\n // Additional icon entry (can appear after text content)\r\n if (reader.remaining < 2) break;\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (tag === 4) {\r\n // Object count header with flags\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const countVal = reader.readUint16();\r\n\r\n if (countVal > 1) {\r\n // Multi-object: read per-object flags\r\n if (reader.remaining < countVal * 2) break;\r\n for (let i = 0; i < countVal; i++) {\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else {\r\n // Single object: read flags\r\n if (reader.remaining < 2) break;\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else if (tag === 5) {\r\n // Positions\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 3\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const x = reader.readInt16() / 10;\r\n const y = reader.readInt16() / 10;\r\n positions.push({ x, y });\r\n }\r\n } else if (tag === 6) {\r\n // Object backgrounds / rotation angles (stored as signed i16)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n // Read as signed to support negative angles\r\n backgrounds.push(reader.readInt16());\r\n }\r\n } else if (tag === 7) {\r\n // Sizes (u8, packed)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 0\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 1; i++) {\r\n sizes.push(reader.readUint8());\r\n }\r\n\r\n // Skip padding byte if odd count\r\n if (count % 2 === 1 && reader.remaining >= 1) {\r\n reader.readUint8();\r\n }\r\n } else if (tag === 8) {\r\n // Colors (RGBA)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 2\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const r = reader.readUint8();\r\n const g = reader.readUint8();\r\n const b = reader.readUint8();\r\n const a = reader.readUint8();\r\n colors.push({ r, g, b, a });\r\n }\r\n } else if (tag === 10) {\r\n // Arc angles\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag10.push(reader.readUint16());\r\n }\r\n } else if (tag === 11) {\r\n // Donut radii\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag11.push(reader.readUint16());\r\n }\r\n } else if (tag === 12) {\r\n // Rotation angles (for line_aoe)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag12.push(reader.readUint16());\r\n }\r\n } else if (tag === 3) {\r\n // Tag 3 can be:\r\n // - Footer: [3][1][1][board_bg] when second value is 1\r\n // - Text content: [3][text_length][text_bytes...] when second value > 1\r\n if (reader.remaining < 2) break;\r\n const val = reader.readUint16();\r\n\r\n if (val === 1) {\r\n // This is the footer\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n boardBackground = reader.readUint16();\r\n break; // Footer is always last\r\n } else {\r\n // This is text content for a text object\r\n // val is the length of the text content\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n // Continue parsing other tags\r\n }\r\n } else {\r\n // Unknown tag, skip\r\n break;\r\n }\r\n }\r\n\r\n // Build objects array\r\n const objects: DecodeResult['objects'] = [];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const iconId = icons[i];\r\n const typeName = ICON_TYPES[iconId] ?? `unknown_${iconId}`;\r\n\r\n const obj: DecodeResult['objects'][0] = {\r\n type: typeName,\r\n typeId: iconId,\r\n x: positions[i]?.x ?? 0,\r\n y: positions[i]?.y ?? 0,\r\n };\r\n\r\n // Size\r\n obj.size = sizes[i] && sizes[i] > 0 ? sizes[i] : 100;\r\n\r\n // Background vs Angle handling\r\n // For rotatable objects (fan_aoe, line_aoe, line_stack, linear_knockback, line, etc.),\r\n // Tag 6 stores the rotation angle (as signed i16), not the background\r\n const rotatableTypes = new Set([10, 11, 12, 15, 16, 17, 18, 19, 110]); // fan_aoe, line_aoe, line, line_stack, etc.\r\n if (rotatableTypes.has(iconId)) {\r\n // Tag 6 is angle for rotatable objects (can be negative)\r\n if (backgrounds[i] !== undefined && backgrounds[i] !== 0) {\r\n obj.angle = backgrounds[i];\r\n }\r\n } else if (backgrounds[i] !== undefined && backgrounds[i] > 0) {\r\n // Tag 6 is background for non-rotatable objects\r\n const bgName = OBJECT_BACKGROUND_TYPES[backgrounds[i]];\r\n obj.background = bgName as BackgroundType ?? backgrounds[i];\r\n }\r\n\r\n // Color - only for objects with settable colors: line_aoe (11), line (12), text (100)\r\n const colorableTypes = new Set([11, 12, 100]);\r\n if (colors[i] && colorableTypes.has(iconId)) {\r\n const { r, g, b, a } = colors[i];\r\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n obj.color = hex;\r\n if (a > 0) {\r\n obj.transparency = a;\r\n }\r\n }\r\n\r\n // Type-specific handling of Tags 10, 11, 12\r\n if (iconId === 11) {\r\n // line_aoe: Tag 10 = width, Tag 11 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.width = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.height = tag11[i];\r\n }\r\n } else if (iconId === 10) {\r\n // fan_aoe: Tag 10 = arc angle\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n } else if (iconId === 12) {\r\n // line: Tag 10 = endX * 10, Tag 11 = endY * 10, Tag 12 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.endX = tag10[i] / 10;\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.endY = tag11[i] / 10;\r\n }\r\n if (tag12[i] && tag12[i] > 0) {\r\n obj.height = tag12[i];\r\n }\r\n } else if (iconId === 15) {\r\n // line_stack: Tag 11 = display count\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.displayCount = tag11[i];\r\n }\r\n } else if (iconId === 110) {\r\n // linear_knockback: Tag 10 = horizontal count, Tag 11 = vertical count\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.horizontalCount = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.verticalCount = tag11[i];\r\n }\r\n } else if (iconId === 17) {\r\n // donut: Tag 10 = arc angle, Tag 11 = inner radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n } else {\r\n // Default handling for arc angle and donut radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n }\r\n\r\n // Text content for text objects (icon ID 100)\r\n if (iconId === 100 && textContents.length > 0) {\r\n obj.text = textContents.shift();\r\n }\r\n\r\n // Flags from Tag 4: bits encode hidden, horizontal flip, vertical flip, locked\r\n // Bit 0 (0x01): visible (1) / hidden (0)\r\n // Bit 1 (0x02): horizontal flip\r\n // Bit 2 (0x04): vertical flip\r\n // Bit 3 (0x08): locked\r\n const objFlags = objectFlags[i] ?? 1;\r\n if ((objFlags & 0x01) === 0) {\r\n obj.hidden = true;\r\n }\r\n if (objFlags & 0x02) {\r\n obj.horizontalFlip = true;\r\n }\r\n if (objFlags & 0x04) {\r\n obj.verticalFlip = true;\r\n }\r\n if (objFlags & 0x08) {\r\n obj.locked = true;\r\n }\r\n\r\n objects.push(obj);\r\n }\r\n\r\n return {\r\n version,\r\n name: name || undefined,\r\n boardBackground: BOARD_BACKGROUND_TYPES[boardBackground] as BackgroundType ?? 'none',\r\n objects,\r\n };\r\n}\r\n\r\n/**\r\n * Builds binary payload from sanitized board data.\r\n *\r\n * @param data - Sanitized board data from validation\r\n * @returns Binary payload\r\n */\r\nexport function buildBinary(data: {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n}): Uint8Array {\r\n const { name, boardBackground, objects } = data;\r\n const n = objects.length;\r\n\r\n // Calculate required buffer size\r\n // Header: 0x24 bytes (36 bytes)\r\n // Tag 2 entries: n * 4 bytes\r\n // Tag 4: 8 bytes for single, 6 + n*2 for multi\r\n // Tag 5 (positions): 6 + n * 4\r\n // Tag 6 (backgrounds): 6 + n * 2\r\n // Tag 7 (sizes): 6 + n + (n % 2 === 1 ? 1 : 0) padding\r\n // Tag 8 (colors): 6 + n * 4\r\n // Tag 10 (arc): 6 + n * 2\r\n // Tag 11 (donut): 6 + n * 2\r\n // Tag 12 (reserved): 6 + n * 2\r\n // Tag 3 (footer): 8\r\n const tag4Size = n <= 1 ? 8 : (6 + n * 2);\r\n const tag7Size = 6 + n + (n % 2 === 1 ? 1 : 0);\r\n const bufferSize = n === 0\r\n ? 0x24 + 8 // Header + footer only\r\n : 0x24 + n * 4 + tag4Size + (6 + n * 4) + (6 + n * 2) + tag7Size + (6 + n * 4) + (6 + n * 2) + (6 + n * 2) + (6 + n * 2) + 8;\r\n\r\n const buffer = new ArrayBuffer(bufferSize);\r\n const view = new DataView(buffer);\r\n let pos = 0;\r\n\r\n // Helper to write values\r\n const writeUint8 = (val: number) => {\r\n view.setUint8(pos, val);\r\n pos += 1;\r\n };\r\n const writeUint16 = (val: number) => {\r\n view.setUint16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeInt16 = (val: number) => {\r\n view.setInt16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeUint32 = (val: number) => {\r\n view.setUint32(pos, val, true);\r\n pos += 4;\r\n };\r\n\r\n // Header (0x00 - 0x23)\r\n writeUint32(2); // Version\r\n writeUint32(0); // Field at 0x04 - will update\r\n for (let i = 0; i < 10; i++) writeUint8(0); // Padding\r\n writeUint32(0); // Payload size - will update\r\n writeUint16(0); // Padding\r\n writeUint16(1); // Object count header\r\n writeUint16(8); // Name length\r\n\r\n // Name (8 bytes, null-padded)\r\n const nameBytes = new TextEncoder().encode(name.slice(0, 7));\r\n for (let i = 0; i < 8; i++) {\r\n writeUint8(nameBytes[i] ?? 0);\r\n }\r\n\r\n // Object list (Tag 2 entries)\r\n for (const obj of objects) {\r\n writeUint16(2);\r\n writeUint16(obj.typeId);\r\n }\r\n\r\n // Skip property tags for empty boards\r\n if (n === 0) {\r\n // Just write footer\r\n } else if (n === 1) {\r\n // Tag 4 - Single object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n const obj = objects[0];\r\n let flagsVal = 1; // visible\r\n if (obj.hidden) {\r\n flagsVal = 0;\r\n } else if (obj.locked) {\r\n flagsVal = 9;\r\n }\r\n writeUint16(1);\r\n writeUint16(flagsVal);\r\n } else {\r\n // Tag 4 - Multi-object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(1);\r\n }\r\n }\r\n\r\n // Only write property tags if there are objects\r\n if (n > 0) {\r\n // Tag 5 - Positions\r\n writeUint16(5);\r\n writeUint16(3);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeInt16(Math.round(obj.x * 10));\r\n writeInt16(Math.round(obj.y * 10));\r\n }\r\n\r\n // Tag 6 - Object backgrounds\r\n writeUint16(6);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.background);\r\n }\r\n\r\n // Tag 7 - Sizes\r\n writeUint16(7);\r\n writeUint16(0);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.size & 0xff);\r\n }\r\n // Padding if odd count\r\n if (n % 2 === 1) {\r\n writeUint8(0);\r\n }\r\n\r\n // Tag 8 - Colors\r\n writeUint16(8);\r\n writeUint16(2);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.colorR);\r\n writeUint8(obj.colorG);\r\n writeUint8(obj.colorB);\r\n writeUint8(obj.transparency);\r\n }\r\n\r\n // Tag 10 - Arc angles\r\n writeUint16(10);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.arcAngle);\r\n }\r\n\r\n // Tag 11 - Donut radii\r\n writeUint16(11);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.donutRadius);\r\n }\r\n\r\n // Tag 12 - Reserved\r\n writeUint16(12);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(0);\r\n }\r\n }\r\n\r\n // Tag 3 - Footer\r\n writeUint16(3);\r\n writeUint16(1);\r\n writeUint16(1);\r\n writeUint16(boardBackground);\r\n\r\n // Trim to actual size\r\n const result = new Uint8Array(buffer, 0, pos);\r\n\r\n // Update sizes in header\r\n const headerView = new DataView(result.buffer, result.byteOffset, result.byteLength);\r\n const payloadSize = pos - 0x1c;\r\n headerView.setUint32(0x12, payloadSize, true);\r\n const field04 = pos - 16;\r\n headerView.setUint32(0x04, field04, true);\r\n\r\n return result;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher encoding and decoding (obfuscation layer).\r\n */\r\n\r\nimport pako from 'pako';\r\nimport {\r\n CIPHER_TABLE,\r\n KEY_REVERSE,\r\n INVERSE_MAPPING,\r\n FORWARD_MAPPING,\r\n} from './constants';\r\n\r\n/**\r\n * Converts a standard Base64 character to its 6-bit value (0-63).\r\n *\r\n * @param c - Single character\r\n * @returns 6-bit value\r\n */\r\nexport function charToBase64Value(c: string): number {\r\n const o = c.charCodeAt(0);\r\n\r\n // A-Z = 0-25\r\n if (o >= 65 && o <= 90) return o - 65;\r\n // a-z = 26-51\r\n if (o >= 97 && o <= 122) return o - 71;\r\n // 0-9 = 52-61\r\n if (o >= 48 && o <= 57) return o + 4;\r\n // URL-safe variants\r\n if (c === '-') return 62;\r\n if (c === '_') return 63;\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Converts a 6-bit value (0-63) to a standard Base64 character.\r\n *\r\n * @param val - 6-bit value\r\n * @returns Base64 character\r\n */\r\nexport function base64ValueToChar(val: number): string {\r\n val = val & 63; // Ensure 6-bit range\r\n\r\n if (val < 26) return String.fromCharCode(val + 65); // A-Z\r\n if (val < 52) return String.fromCharCode(val + 71); // a-z\r\n if (val < 62) return String.fromCharCode(val - 4); // 0-9\r\n if (val === 62) return '-';\r\n if (val === 63) return '_';\r\n\r\n return 'A';\r\n}\r\n\r\n/**\r\n * Decodes an obfuscated share code string to binary data.\r\n *\r\n * @param stgyString - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decompressed binary data\r\n * @throws {Error} If decoding fails\r\n */\r\nexport function decodeCipher(stgyString: string): Uint8Array {\r\n // Extract body: [stgy:a<body>]\r\n const data = stgyString.slice(7, -1);\r\n\r\n if (data.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // First character encodes the cipher key\r\n const keyChar = data[0];\r\n const keyCharCode = keyChar.charCodeAt(0);\r\n\r\n if (keyCharCode >= CIPHER_TABLE.length) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMapped = CIPHER_TABLE[keyCharCode];\r\n if (keyMapped === 0) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMappedChar = String.fromCharCode(keyMapped);\r\n const key = charToBase64Value(keyMappedChar);\r\n\r\n // Decode remaining characters\r\n const decoded: string[] = [];\r\n\r\n for (let i = 0; i < data.length - 1; i++) {\r\n const c = data[i + 1];\r\n const charCode = c.charCodeAt(0);\r\n\r\n // Apply inverse substitution\r\n const standardCharCode = INVERSE_MAPPING[charCode] ?? 65; // Default to 'A'\r\n const standardChar = String.fromCharCode(standardCharCode);\r\n\r\n // Get base64 value and apply reverse shift\r\n const val = charToBase64Value(standardChar);\r\n const decodedVal = (val - i - key) & 63;\r\n\r\n decoded.push(base64ValueToChar(decodedVal));\r\n }\r\n\r\n // Convert URL-safe Base64 to standard Base64\r\n let b64String = decoded.join('').replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // Add proper padding based on length\r\n const padLength = (4 - (b64String.length % 4)) % 4;\r\n b64String += '='.repeat(padLength);\r\n\r\n // Decode Base64\r\n const binaryString = atob(b64String);\r\n const binaryData = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n binaryData[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Skip 6-byte header and decompress\r\n if (binaryData.length < 7) {\r\n throw new Error('Binary data is too short');\r\n }\r\n\r\n try {\r\n const compressed = binaryData.slice(6);\r\n return pako.inflate(compressed);\r\n } catch (e) {\r\n throw new Error(`Failed to decompress data: ${e instanceof Error ? e.message : 'unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Encodes binary data to an obfuscated share code string.\r\n *\r\n * @param binaryData - Binary data to encode\r\n * @param key - Optional cipher key (0-63), random if not provided\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n */\r\nexport function encodeCipher(binaryData: Uint8Array, key?: number): string {\r\n // Compress the data\r\n const compressed = pako.deflate(binaryData, { level: 6 });\r\n\r\n // Build header: [u32 checksum][u16 length]\r\n const length = binaryData.length;\r\n const lengthBytes = new Uint8Array(2);\r\n lengthBytes[0] = length & 0xff;\r\n lengthBytes[1] = (length >> 8) & 0xff;\r\n\r\n // Calculate CRC32 of length + compressed data\r\n const checksumInput = new Uint8Array(2 + compressed.length);\r\n checksumInput.set(lengthBytes, 0);\r\n checksumInput.set(compressed, 2);\r\n const checksum = crc32(checksumInput);\r\n\r\n // Build full payload: header + compressed\r\n const fullData = new Uint8Array(6 + compressed.length);\r\n fullData[0] = checksum & 0xff;\r\n fullData[1] = (checksum >> 8) & 0xff;\r\n fullData[2] = (checksum >> 16) & 0xff;\r\n fullData[3] = (checksum >> 24) & 0xff;\r\n fullData[4] = lengthBytes[0];\r\n fullData[5] = lengthBytes[1];\r\n fullData.set(compressed, 6);\r\n\r\n // Convert to Base64\r\n let b64 = '';\r\n for (let i = 0; i < fullData.length; i++) {\r\n b64 += String.fromCharCode(fullData[i]);\r\n }\r\n b64 = btoa(b64);\r\n\r\n // Convert to URL-safe Base64 and remove padding\r\n b64 = b64.replace(/=+$/, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n\r\n // Use provided key or generate random\r\n if (key === undefined || key < 0 || key > 63) {\r\n key = Math.floor(Math.random() * 64);\r\n }\r\n\r\n // Get key character for output\r\n const keyCharStandard = base64ValueToChar(key);\r\n const keyCharCode = keyCharStandard.charCodeAt(0);\r\n const keySource = KEY_REVERSE[keyCharCode] ?? 86; // Default to 'V'\r\n\r\n // Encode each character\r\n const encoded: string[] = [];\r\n\r\n for (let i = 0; i < b64.length; i++) {\r\n const c = b64[i];\r\n const val = charToBase64Value(c);\r\n const encodedVal = (val + i + key) & 63;\r\n const standardChar = base64ValueToChar(encodedVal);\r\n const standardCharCode = standardChar.charCodeAt(0);\r\n const substChar = FORWARD_MAPPING[standardCharCode] ?? 65; // Default to 'A'\r\n encoded.push(String.fromCharCode(substChar));\r\n }\r\n\r\n return `[stgy:a${String.fromCharCode(keySource)}${encoded.join('')}]`;\r\n}\r\n\r\n/**\r\n * CRC32 implementation (same as zlib.crc32).\r\n */\r\nfunction crc32(data: Uint8Array): number {\r\n let crc = 0xffffffff;\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n crc ^= data[i];\r\n for (let j = 0; j < 8; j++) {\r\n if (crc & 1) {\r\n crc = (crc >>> 1) ^ 0xedb88320;\r\n } else {\r\n crc = crc >>> 1;\r\n }\r\n }\r\n }\r\n\r\n return (crc ^ 0xffffffff) >>> 0;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board encoder (JSON → share code).\r\n */\r\n\r\nimport type { StrategyBoard, EncodeOptions } from './types';\r\nimport { sanitizeBoard } from './validation';\r\nimport { buildBinary } from './binary';\r\nimport { encodeCipher } from './cipher';\r\n\r\n/**\r\n * Encodes a strategy board to a share code.\r\n *\r\n * @param board - Strategy board to encode\r\n * @param options - Optional encoding options\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n * @throws {Error} If board data is invalid\r\n *\r\n * @example\r\n * ```ts\r\n * import { encode } from 'xiv-strat-board';\r\n *\r\n * const shareCode = encode({\r\n * name: 'myboard',\r\n * boardBackground: 'checkered',\r\n * objects: [\r\n * { type: 'tank', x: 256, y: 192, size: 100 },\r\n * { type: 'healer', x: 300, y: 192, size: 100 },\r\n * ],\r\n * });\r\n *\r\n * console.log(shareCode); // \"[stgy:a...]\"\r\n * ```\r\n */\r\nexport function encode(board: StrategyBoard, options?: EncodeOptions): string {\r\n // Validate and sanitize input\r\n const sanitized = sanitizeBoard(board);\r\n\r\n // Build binary format\r\n const binary = buildBinary(sanitized);\r\n\r\n // Encode with cipher\r\n return encodeCipher(binary, options?.key);\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board decoder (share code → JSON).\r\n */\r\n\r\nimport type { DecodeResult } from './types';\r\nimport { validateShareCode } from './validation';\r\nimport { decodeCipher } from './cipher';\r\nimport { parseBinary } from './binary';\r\n\r\n/**\r\n * Decodes a share code to a strategy board.\r\n *\r\n * @param shareCode - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decoded strategy board\r\n * @throws {Error} If share code is invalid or malformed\r\n *\r\n * @example\r\n * ```ts\r\n * import { decode } from 'xiv-strat-board';\r\n *\r\n * const board = decode('[stgy:aVe......]');\r\n *\r\n * console.log(board.name);\r\n * console.log(board.objects.length);\r\n * for (const obj of board.objects) {\r\n * console.log(`${obj.type} at (${obj.x}, ${obj.y})`);\r\n * }\r\n * ```\r\n */\r\nexport function decode(shareCode: string): DecodeResult {\r\n // Validate share code format\r\n validateShareCode(shareCode);\r\n\r\n // Decode cipher and decompress\r\n const binary = decodeCipher(shareCode);\r\n\r\n // Parse binary format\r\n return parseBinary(binary);\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/validation.ts","../src/binary.ts","../src/cipher.ts","../src/encoder.ts","../src/decoder.ts"],"names":["pako"],"mappings":"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AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC7D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC5D,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC7D,GAAA,EAA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","file":"index.cjs","sourcesContent":["/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher tables and icon/background mappings from game data.\r\n */\r\n\r\n/**\r\n * Cipher lookup table (DAT_1420cf520 from game binary).\r\n * Used to decode the key character in share codes.\r\n */\r\nexport const CIPHER_TABLE = new Uint8Array([\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 80, 0, 0,\r\n 120, 103, 48, 75, 56, 83, 74, 50, 115, 90, 0, 0, 0, 0, 0, 0,\r\n 0, 68, 70, 116, 84, 54, 69, 97, 86, 99, 112, 76, 77, 109, 101, 106,\r\n 57, 88, 66, 52, 82, 89, 55, 95, 110, 79, 98, 0, 0, 0, 0, 0,\r\n 0, 105, 45, 118, 72, 67, 65, 114, 87, 111, 100, 73, 113, 104, 85, 108,\r\n 107, 51, 102, 121, 53, 71, 119, 49, 117, 122, 81, 0, 0, 0, 0, 0,\r\n]);\r\n\r\n/**\r\n * Reverse mapping of CIPHER_TABLE for encoding.\r\n * Maps output character code -> input character code.\r\n */\r\nexport const KEY_REVERSE: Record<number, number> = {};\r\nfor (let i = 0; i < CIPHER_TABLE.length; i++) {\r\n if (CIPHER_TABLE[i] !== 0) {\r\n KEY_REVERSE[CIPHER_TABLE[i]] = i;\r\n }\r\n}\r\n\r\n/**\r\n * Inverse character substitution mapping.\r\n * Maps obfuscated character code -> standard Base64 character code.\r\n */\r\nexport const INVERSE_MAPPING: Record<number, number> = {\r\n 98: 45, 50: 48, 119: 49, 55: 50, 113: 51, 83: 52, 116: 53, 69: 54,\r\n 86: 55, 52: 56, 80: 57, 102: 65, 82: 66, 101: 67, 65: 68, 70: 69,\r\n 66: 70, 117: 71, 100: 72, 107: 73, 54: 74, 51: 75, 75: 76, 76: 77,\r\n 43: 78, 89: 79, 45: 80, 122: 81, 84: 82, 53: 83, 68: 84, 110: 85,\r\n 72: 86, 104: 87, 81: 88, 85: 89, 57: 90, 87: 95, 71: 97, 90: 98,\r\n 73: 99, 106: 100, 78: 101, 114: 102, 49: 103, 109: 104, 97: 105,\r\n 79: 106, 112: 107, 111: 108, 77: 109, 88: 110, 105: 111, 74: 112,\r\n 108: 113, 103: 114, 56: 115, 67: 116, 120: 117, 99: 118, 118: 119,\r\n 48: 120, 115: 121, 121: 122,\r\n};\r\n\r\n/**\r\n * Forward character substitution mapping (reverse of INVERSE_MAPPING).\r\n * Maps standard Base64 character code -> obfuscated character code.\r\n */\r\nexport const FORWARD_MAPPING: Record<number, number> = {};\r\nfor (const [k, v] of Object.entries(INVERSE_MAPPING)) {\r\n FORWARD_MAPPING[v] = Number(k);\r\n}\r\n\r\n/**\r\n * Icon type name to numeric ID mapping.\r\n * Complete list from stgy.csv game data.\r\n */\r\nexport const ICON_TYPE_IDS: Record<string, number> = {\r\n // Field backgrounds (type 1)\r\n checkered_circle: 4,\r\n checkered_square: 8,\r\n grey_circle: 124,\r\n grey_square: 125,\r\n\r\n // AoE/Mechanics (type 6)\r\n circle_aoe: 9,\r\n fan_aoe: 10,\r\n line_aoe: 11,\r\n line: 12,\r\n gaze: 13,\r\n stack: 14,\r\n line_stack: 15,\r\n proximity: 16,\r\n donut: 17,\r\n stack_multi: 106,\r\n proximity_player: 107,\r\n tankbuster: 108,\r\n radial_knockback: 109,\r\n linear_knockback: 110,\r\n tower: 111,\r\n targeting: 112,\r\n moving_circle_aoe: 126,\r\n '1person_aoe': 127,\r\n '2person_aoe': 128,\r\n '3person_aoe': 129,\r\n '4person_aoe': 130,\r\n\r\n // Base classes (type 2)\r\n gladiator: 18,\r\n pugilist: 19,\r\n marauder: 20,\r\n lancer: 21,\r\n archer: 22,\r\n conjurer: 23,\r\n thaumaturge: 24,\r\n arcanist: 25,\r\n rogue: 26,\r\n\r\n // Jobs (type 2)\r\n paladin: 27,\r\n monk: 28,\r\n warrior: 29,\r\n dragoon: 30,\r\n bard: 31,\r\n white_mage: 32,\r\n black_mage: 33,\r\n summoner: 34,\r\n scholar: 35,\r\n ninja: 36,\r\n machinist: 37,\r\n dark_knight: 38,\r\n astrologian: 39,\r\n samurai: 40,\r\n red_mage: 41,\r\n blue_mage: 42,\r\n gunbreaker: 43,\r\n dancer: 44,\r\n reaper: 45,\r\n sage: 46,\r\n viper: 101,\r\n pictomancer: 102,\r\n\r\n // Role markers (type 2)\r\n tank: 47,\r\n tank_1: 48,\r\n tank_2: 49,\r\n healer: 50,\r\n healer_1: 51,\r\n healer_2: 52,\r\n dps: 53,\r\n dps_1: 54,\r\n dps_2: 55,\r\n dps_3: 56,\r\n dps_4: 57,\r\n melee_dps: 118,\r\n ranged_dps: 119,\r\n physical_ranged_dps: 120,\r\n magical_ranged_dps: 121,\r\n pure_healer: 122,\r\n barrier_healer: 123,\r\n\r\n // Enemies (type 3)\r\n small_enemy: 60,\r\n medium_enemy: 62,\r\n large_enemy: 64,\r\n\r\n // Target markers (type 3)\r\n attack_1: 65,\r\n attack_2: 66,\r\n attack_3: 67,\r\n attack_4: 68,\r\n attack_5: 69,\r\n attack_6: 115,\r\n attack_7: 116,\r\n attack_8: 117,\r\n bind_1: 70,\r\n bind_2: 71,\r\n bind_3: 72,\r\n ignore_1: 73,\r\n ignore_2: 74,\r\n\r\n // Chain markers (type 3)\r\n square_marker: 75,\r\n circle_marker: 76,\r\n plus_marker: 77,\r\n triangle_marker: 78,\r\n\r\n // Waymarks (type 3)\r\n waymark_a: 79,\r\n waymark_b: 80,\r\n waymark_c: 81,\r\n waymark_d: 82,\r\n waymark_1: 83,\r\n waymark_2: 84,\r\n waymark_3: 85,\r\n waymark_4: 86,\r\n\r\n // Shapes (type 4)\r\n shape_circle: 87,\r\n shape_x: 88,\r\n shape_triangle: 89,\r\n shape_square: 90,\r\n up_arrow: 94,\r\n text: 100,\r\n rotate: 103,\r\n highlighted_circle: 135,\r\n highlighted_x: 136,\r\n highlighted_square: 137,\r\n highlighted_triangle: 138,\r\n rotate_clockwise: 139,\r\n rotate_counterclockwise: 140,\r\n\r\n // Effects (type 3)\r\n enhancement: 113,\r\n enfeeblement: 114,\r\n\r\n // Lock-on markers (type 3)\r\n lockon_red: 131,\r\n lockon_blue: 132,\r\n lockon_purple: 133,\r\n lockon_green: 134,\r\n\r\n // Groups (type 5)\r\n group: 105,\r\n};\r\n\r\n/**\r\n * Icon numeric ID to type name mapping (reverse of ICON_TYPE_IDS).\r\n */\r\nexport const ICON_TYPES: Record<number, string> = {};\r\nfor (const [name, id] of Object.entries(ICON_TYPE_IDS)) {\r\n ICON_TYPES[id] = name;\r\n}\r\n\r\n/**\r\n * Board background numeric ID to name mapping.\r\n * Used in Tag 3 footer.\r\n */\r\nexport const BOARD_BACKGROUND_TYPES: Record<number, string> = {\r\n 1: 'none',\r\n 2: 'checkered',\r\n 3: 'checkered_circle',\r\n 4: 'checkered_square',\r\n 5: 'grey',\r\n 6: 'grey_circle',\r\n 7: 'grey_square',\r\n};\r\n\r\n/**\r\n * Board background name to numeric ID mapping.\r\n */\r\nexport const BOARD_BACKGROUND_IDS: Record<string, number> = {\r\n none: 1,\r\n checkered: 2,\r\n checkered_circle: 3,\r\n checkered_square: 4,\r\n grey: 5,\r\n grey_circle: 6,\r\n grey_square: 7,\r\n};\r\n\r\n/**\r\n * Object background numeric ID to name mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_TYPES: Record<number, string> = {\r\n 0: 'none',\r\n 1: 'checkered',\r\n 2: 'checkered_circle',\r\n 3: 'checkered_square',\r\n 4: 'grey',\r\n 5: 'grey_circle',\r\n 6: 'grey_square',\r\n};\r\n\r\n/**\r\n * Object background name to numeric ID mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_IDS: Record<string, number> = {\r\n none: 0,\r\n checkered: 1,\r\n checkered_circle: 2,\r\n checkered_square: 3,\r\n grey: 4,\r\n grey_circle: 5,\r\n grey_square: 6,\r\n};\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Input validation and sanitization for secure public package usage.\r\n */\r\n\r\nimport type { StrategyBoard, StrategyObject } from './types';\r\nimport { ICON_TYPE_IDS, BOARD_BACKGROUND_IDS, OBJECT_BACKGROUND_IDS } from './constants';\r\n\r\n/**\r\n * Board coordinate and property bounds.\r\n */\r\nexport const BOUNDS = {\r\n /** Minimum X coordinate (allows slight overflow for edge objects) */\r\n minX: -100,\r\n /** Maximum X coordinate */\r\n maxX: 612,\r\n /** Minimum Y coordinate */\r\n minY: -100,\r\n /** Maximum Y coordinate */\r\n maxY: 484,\r\n /** Minimum size percentage */\r\n minSize: 1,\r\n /** Maximum size percentage */\r\n maxSize: 255,\r\n /** Minimum arc angle */\r\n minArc: 0,\r\n /** Maximum arc angle */\r\n maxArc: 360,\r\n /** Minimum donut radius */\r\n minDonut: 0,\r\n /** Maximum donut radius */\r\n maxDonut: 255,\r\n /** Maximum number of objects per board */\r\n maxObjects: 50,\r\n /** Maximum name length (bytes) */\r\n maxNameLength: 7,\r\n} as const;\r\n\r\n/**\r\n * Characters allowed in cipher-encoded body.\r\n */\r\nconst VALID_CIPHER_CHARS = new Set(\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-_'.split('')\r\n);\r\n\r\n/**\r\n * Validates the format of a share code string.\r\n *\r\n * @param code - The share code to validate\r\n * @throws {Error} If the share code format is invalid\r\n */\r\nexport function validateShareCode(code: string): void {\r\n if (typeof code !== 'string') {\r\n throw new Error('Share code must be a string');\r\n }\r\n\r\n if (code.length < 10) {\r\n throw new Error('Share code is too short');\r\n }\r\n\r\n if (code.length > 10000) {\r\n throw new Error('Share code is too long');\r\n }\r\n\r\n if (!code.startsWith('[stgy:a')) {\r\n throw new Error('Share code must start with \"[stgy:a\"');\r\n }\r\n\r\n if (!code.endsWith(']')) {\r\n throw new Error('Share code must end with \"]\"');\r\n }\r\n\r\n // Extract body (between [stgy:a and ])\r\n const body = code.slice(7, -1);\r\n\r\n if (body.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // Validate all characters in body\r\n for (const char of body) {\r\n if (!VALID_CIPHER_CHARS.has(char)) {\r\n throw new Error(`Invalid character in share code: \"${char}\"`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Clamps a number to a range.\r\n */\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a board name.\r\n * Only allows ASCII alphanumeric characters, truncates to max length.\r\n *\r\n * @param name - The name to sanitize\r\n * @returns Sanitized name\r\n */\r\nexport function sanitizeName(name: string | undefined): string {\r\n if (!name || typeof name !== 'string') {\r\n return 'board';\r\n }\r\n\r\n // Remove non-ASCII and control characters, keep alphanumeric and some safe chars\r\n const sanitized = name\r\n .replace(/[^\\x20-\\x7E]/g, '') // Only printable ASCII\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove filesystem-unsafe chars\r\n .trim()\r\n .slice(0, BOUNDS.maxNameLength);\r\n\r\n return sanitized || 'board';\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a coordinate value.\r\n *\r\n * @param value - The coordinate value\r\n * @param isX - Whether this is an X coordinate\r\n * @returns Sanitized coordinate\r\n */\r\nexport function sanitizeCoordinate(value: unknown, isX: boolean): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return isX ? 256 : 192; // Default to center\r\n }\r\n\r\n const min = isX ? BOUNDS.minX : BOUNDS.minY;\r\n const max = isX ? BOUNDS.maxX : BOUNDS.maxY;\r\n\r\n return clamp(Math.round(value * 10) / 10, min, max);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a size value.\r\n *\r\n * @param value - The size value\r\n * @returns Sanitized size (50-200 range, default 100)\r\n */\r\nexport function sanitizeSize(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 100;\r\n }\r\n return clamp(Math.round(value), BOUNDS.minSize, BOUNDS.maxSize);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a color component (0-255).\r\n */\r\nexport function sanitizeColorComponent(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 255;\r\n }\r\n return clamp(Math.round(value), 0, 255);\r\n}\r\n\r\n/**\r\n * Parses a hex color string to RGB components.\r\n *\r\n * @param color - Hex color string (e.g., '#FF0000' or 'FF0000')\r\n * @returns RGB components or null if invalid\r\n */\r\nexport function parseHexColor(color: string | undefined): { r: number; g: number; b: number } | null {\r\n if (!color || typeof color !== 'string') {\r\n return null;\r\n }\r\n\r\n // Remove # prefix if present\r\n const hex = color.replace(/^#/, '');\r\n\r\n // Validate hex format\r\n if (!/^[0-9A-Fa-f]{6}$/.test(hex)) {\r\n return null;\r\n }\r\n\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n}\r\n\r\n/**\r\n * Validates a background type value.\r\n */\r\nexport function validateBackground(value: unknown): number {\r\n if (typeof value === 'number') {\r\n if (value >= 0 && value <= 6) {\r\n return value;\r\n }\r\n return 0;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const id = OBJECT_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 0;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Validates a board background type value.\r\n */\r\nexport function validateBoardBackground(value: unknown): number {\r\n if (typeof value === 'string') {\r\n const id = BOARD_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 1;\r\n }\r\n\r\n if (typeof value === 'number' && value >= 1 && value <= 7) {\r\n return value;\r\n }\r\n\r\n return 1; // default: none\r\n}\r\n\r\n/**\r\n * Validates an icon type, returning the numeric ID.\r\n *\r\n * @param typeName - Icon type name or ID\r\n * @param typeId - Optional explicit type ID\r\n * @returns Numeric icon type ID\r\n * @throws {Error} If icon type is unknown\r\n */\r\nexport function validateIconType(typeName: string, typeId?: number): number {\r\n // Explicit typeId takes priority\r\n if (typeof typeId === 'number' && Number.isFinite(typeId) && typeId > 0 && typeId < 256) {\r\n return typeId;\r\n }\r\n\r\n // Look up by name\r\n const id = ICON_TYPE_IDS[typeName];\r\n if (id !== undefined) {\r\n return id;\r\n }\r\n\r\n // Try to parse as unknown_{id} format\r\n const unknownMatch = typeName.match(/^unknown_(\\d+)$/);\r\n if (unknownMatch) {\r\n const parsedId = parseInt(unknownMatch[1], 10);\r\n if (parsedId > 0 && parsedId < 256) {\r\n return parsedId;\r\n }\r\n }\r\n\r\n throw new Error(`Unknown icon type: \"${typeName}\"`);\r\n}\r\n\r\n/**\r\n * Sanitizes a single strategy object.\r\n *\r\n * @param obj - The object to sanitize\r\n * @param index - Object index for error messages\r\n * @returns Sanitized object data\r\n * @throws {Error} If object data is invalid\r\n */\r\nexport function sanitizeObject(\r\n obj: StrategyObject,\r\n index: number\r\n): {\r\n typeId: number;\r\n x: number;\r\n y: number;\r\n size: number;\r\n background: number;\r\n colorR: number;\r\n colorG: number;\r\n colorB: number;\r\n transparency: number;\r\n arcAngle: number;\r\n donutRadius: number;\r\n hidden: boolean;\r\n locked: boolean;\r\n} {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error(`Object at index ${index} is not a valid object`);\r\n }\r\n\r\n if (!obj.type && !obj.typeId) {\r\n throw new Error(`Object at index ${index} must have a type or typeId`);\r\n }\r\n\r\n const typeId = validateIconType(obj.type || '', obj.typeId);\r\n\r\n // Parse color from hex string or components\r\n let colorR = obj.colorR ?? 255;\r\n let colorG = obj.colorG ?? 255;\r\n let colorB = obj.colorB ?? 255;\r\n\r\n if (obj.color) {\r\n const parsed = parseHexColor(obj.color);\r\n if (parsed) {\r\n colorR = parsed.r;\r\n colorG = parsed.g;\r\n colorB = parsed.b;\r\n }\r\n }\r\n\r\n return {\r\n typeId,\r\n x: sanitizeCoordinate(obj.x, true),\r\n y: sanitizeCoordinate(obj.y, false),\r\n size: sanitizeSize(obj.size),\r\n background: validateBackground(obj.background),\r\n colorR: sanitizeColorComponent(colorR),\r\n colorG: sanitizeColorComponent(colorG),\r\n colorB: sanitizeColorComponent(colorB),\r\n transparency: sanitizeColorComponent(obj.transparency ?? 0),\r\n arcAngle: clamp(Math.round(obj.arcAngle ?? 0), BOUNDS.minArc, BOUNDS.maxArc),\r\n donutRadius: clamp(Math.round(obj.donutRadius ?? 0), BOUNDS.minDonut, BOUNDS.maxDonut),\r\n hidden: Boolean(obj.hidden),\r\n locked: Boolean(obj.locked),\r\n };\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a complete strategy board for encoding.\r\n *\r\n * @param board - The board to sanitize\r\n * @returns Sanitized board data ready for binary encoding\r\n * @throws {Error} If board data is invalid\r\n */\r\nexport function sanitizeBoard(board: StrategyBoard): {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n} {\r\n if (!board || typeof board !== 'object') {\r\n throw new Error('Board must be an object');\r\n }\r\n\r\n if (!Array.isArray(board.objects)) {\r\n throw new Error('Board must have an objects array');\r\n }\r\n\r\n if (board.objects.length > BOUNDS.maxObjects) {\r\n throw new Error(`Board has too many objects (max ${BOUNDS.maxObjects})`);\r\n }\r\n\r\n return {\r\n name: sanitizeName(board.name),\r\n boardBackground: validateBoardBackground(board.boardBackground),\r\n objects: board.objects.map((obj, i) => sanitizeObject(obj, i)),\r\n };\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Binary format builder and parser (TLV format).\r\n */\r\n\r\nimport type { DecodeResult, BackgroundType } from './types';\r\nimport {\r\n ICON_TYPES,\r\n BOARD_BACKGROUND_TYPES,\r\n OBJECT_BACKGROUND_TYPES,\r\n} from './constants';\r\nimport type { sanitizeObject } from './validation';\r\n\r\n/**\r\n * DataView wrapper for reading binary data with bounds checking.\r\n */\r\nclass BinaryReader {\r\n private view: DataView;\r\n private pos: number;\r\n\r\n constructor(data: Uint8Array) {\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.pos = 0;\r\n }\r\n\r\n get position(): number {\r\n return this.pos;\r\n }\r\n\r\n get length(): number {\r\n return this.view.byteLength;\r\n }\r\n\r\n get remaining(): number {\r\n return this.length - this.pos;\r\n }\r\n\r\n seek(pos: number): void {\r\n if (pos < 0 || pos > this.length) {\r\n throw new Error(`Seek position ${pos} out of bounds [0, ${this.length}]`);\r\n }\r\n this.pos = pos;\r\n }\r\n\r\n readUint8(): number {\r\n if (this.pos + 1 > this.length) {\r\n throw new Error('Unexpected end of data reading uint8');\r\n }\r\n const val = this.view.getUint8(this.pos);\r\n this.pos += 1;\r\n return val;\r\n }\r\n\r\n readInt16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading int16');\r\n }\r\n const val = this.view.getInt16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading uint16');\r\n }\r\n const val = this.view.getUint16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint32(): number {\r\n if (this.pos + 4 > this.length) {\r\n throw new Error('Unexpected end of data reading uint32');\r\n }\r\n const val = this.view.getUint32(this.pos, true); // little-endian\r\n this.pos += 4;\r\n return val;\r\n }\r\n\r\n readBytes(count: number): Uint8Array {\r\n if (this.pos + count > this.length) {\r\n throw new Error(`Unexpected end of data reading ${count} bytes`);\r\n }\r\n const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.pos, count);\r\n this.pos += count;\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Parses decompressed binary data into a strategy board structure.\r\n *\r\n * @param data - Decompressed binary data\r\n * @returns Parsed board structure\r\n * @throws {Error} If binary format is invalid\r\n */\r\nexport function parseBinary(data: Uint8Array): DecodeResult {\r\n if (data.length < 0x1C) {\r\n throw new Error('Binary data is too short for header');\r\n }\r\n\r\n const reader = new BinaryReader(data);\r\n\r\n // Parse header\r\n const version = reader.readUint32();\r\n\r\n // Skip fields at 0x04-0x17\r\n reader.seek(0x18);\r\n reader.readUint16(); // object_count_header (always 1)\r\n\r\n // Read name length at 0x1A\r\n const nameLength = reader.readUint16();\r\n\r\n if (data.length < 0x1C + nameLength) {\r\n throw new Error('Binary data is too short for name field');\r\n }\r\n\r\n // Read name at 0x1C with variable length\r\n const nameBytes = reader.readBytes(nameLength);\r\n const name = new TextDecoder('utf-8', { fatal: false })\r\n .decode(nameBytes)\r\n .replace(/\\0+$/, '')\r\n .trim();\r\n\r\n // Parse icon list (Tag 2 entries) with interleaved text content (Tag 3)\r\n // Text content appears immediately after text icons (iconId 100) in the stream\r\n const icons: number[] = [];\r\n const textContents: string[] = []; // Text content for text objects\r\n while (reader.remaining >= 4) {\r\n const marker = reader.readUint16();\r\n if (marker === 2) {\r\n // Icon entry\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (marker === 3) {\r\n // Tag 3: text content (length > 1) or footer indicator (length = 1)\r\n const val = reader.readUint16();\r\n if (val > 1) {\r\n // Text content - appears after text icon entries\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n } else {\r\n // Footer indicator (val === 1), rewind and let main loop handle it\r\n reader.seek(reader.position - 4);\r\n break;\r\n }\r\n } else {\r\n // Other tag, rewind and break to main tag parsing\r\n reader.seek(reader.position - 2);\r\n break;\r\n }\r\n }\r\n\r\n const n = icons.length;\r\n\r\n // Storage for object properties\r\n const positions: Array<{ x: number; y: number }> = [];\r\n const backgrounds: number[] = []; // Tag 6: also used for rotation angle in rotatable objects\r\n const sizes: number[] = [];\r\n const colors: Array<{ r: number; g: number; b: number; a: number }> = [];\r\n const tag10: number[] = []; // Tag 10: arc angle for fan_aoe, width for line_aoe, horiz count for knockback\r\n const tag11: number[] = []; // Tag 11: donut radius, height for line_aoe, vert count/display count\r\n const tag12: number[] = []; // Tag 12: reserved\r\n const objectFlags: number[] = []; // Per-object flags from Tag 4\r\n let boardBackground = 1; // default: none\r\n\r\n // Parse tags\r\n while (reader.remaining >= 2) {\r\n const tag = reader.readUint16();\r\n\r\n if (tag === 2) {\r\n // Additional icon entry (can appear after text content)\r\n if (reader.remaining < 2) break;\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (tag === 4) {\r\n // Object count header with flags\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const countVal = reader.readUint16();\r\n\r\n if (countVal > 1) {\r\n // Multi-object: read per-object flags\r\n if (reader.remaining < countVal * 2) break;\r\n for (let i = 0; i < countVal; i++) {\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else {\r\n // Single object: read flags\r\n if (reader.remaining < 2) break;\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else if (tag === 5) {\r\n // Positions\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 3\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const x = reader.readInt16() / 10;\r\n const y = reader.readInt16() / 10;\r\n positions.push({ x, y });\r\n }\r\n } else if (tag === 6) {\r\n // Object backgrounds / rotation angles (stored as signed i16)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n // Read as signed to support negative angles\r\n backgrounds.push(reader.readInt16());\r\n }\r\n } else if (tag === 7) {\r\n // Sizes (u8, packed)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 0\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 1; i++) {\r\n sizes.push(reader.readUint8());\r\n }\r\n\r\n // Skip padding byte if odd count\r\n if (count % 2 === 1 && reader.remaining >= 1) {\r\n reader.readUint8();\r\n }\r\n } else if (tag === 8) {\r\n // Colors (RGBA)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 2\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const r = reader.readUint8();\r\n const g = reader.readUint8();\r\n const b = reader.readUint8();\r\n const a = reader.readUint8();\r\n colors.push({ r, g, b, a });\r\n }\r\n } else if (tag === 10) {\r\n // Arc angles\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag10.push(reader.readUint16());\r\n }\r\n } else if (tag === 11) {\r\n // Donut radii\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag11.push(reader.readUint16());\r\n }\r\n } else if (tag === 12) {\r\n // Rotation angles (for line_aoe)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag12.push(reader.readUint16());\r\n }\r\n } else if (tag === 3) {\r\n // Tag 3 can be:\r\n // - Footer: [3][1][1][board_bg] when second value is 1\r\n // - Text content: [3][text_length][text_bytes...] when second value > 1\r\n if (reader.remaining < 2) break;\r\n const val = reader.readUint16();\r\n\r\n if (val === 1) {\r\n // This is the footer\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n boardBackground = reader.readUint16();\r\n break; // Footer is always last\r\n } else {\r\n // This is text content for a text object\r\n // val is the length of the text content\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n // Continue parsing other tags\r\n }\r\n } else {\r\n // Unknown tag, skip\r\n break;\r\n }\r\n }\r\n\r\n // Build objects array\r\n const objects: DecodeResult['objects'] = [];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const iconId = icons[i];\r\n const typeName = ICON_TYPES[iconId] ?? `unknown_${iconId}`;\r\n\r\n const obj: DecodeResult['objects'][0] = {\r\n type: typeName,\r\n typeId: iconId,\r\n x: positions[i]?.x ?? 0,\r\n y: positions[i]?.y ?? 0,\r\n };\r\n\r\n // Size\r\n obj.size = sizes[i] && sizes[i] > 0 ? sizes[i] : 100;\r\n\r\n // Background vs Angle handling\r\n // For rotatable objects (fan_aoe, line_aoe, line_stack, linear_knockback, line, etc.),\r\n // Tag 6 stores the rotation angle (as signed i16), not the background\r\n const rotatableTypes = new Set([10, 11, 12, 15, 16, 17, 18, 19, 110]); // fan_aoe, line_aoe, line, line_stack, etc.\r\n if (rotatableTypes.has(iconId)) {\r\n // Tag 6 is angle for rotatable objects (can be negative)\r\n if (backgrounds[i] !== undefined && backgrounds[i] !== 0) {\r\n obj.angle = backgrounds[i];\r\n }\r\n } else if (backgrounds[i] !== undefined && backgrounds[i] > 0) {\r\n // Tag 6 is background for non-rotatable objects\r\n const bgName = OBJECT_BACKGROUND_TYPES[backgrounds[i]];\r\n obj.background = bgName as BackgroundType ?? backgrounds[i];\r\n }\r\n\r\n // Color - only for objects with settable colors: line_aoe (11), line (12), text (100)\r\n const colorableTypes = new Set([11, 12, 100]);\r\n if (colors[i]) {\r\n const { r, g, b, a } = colors[i];\r\n // Color is only settable for certain types\r\n if (colorableTypes.has(iconId)) {\r\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n obj.color = hex;\r\n }\r\n // Transparency applies to all objects\r\n if (a > 0) {\r\n obj.transparency = a;\r\n }\r\n }\r\n\r\n // Type-specific handling of Tags 10, 11, 12\r\n if (iconId === 11) {\r\n // line_aoe: Tag 10 = width, Tag 11 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.width = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.height = tag11[i];\r\n }\r\n } else if (iconId === 10) {\r\n // fan_aoe: Tag 10 = arc angle\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n } else if (iconId === 12) {\r\n // line: Tag 10 = endX * 10, Tag 11 = endY * 10, Tag 12 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.endX = tag10[i] / 10;\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.endY = tag11[i] / 10;\r\n }\r\n if (tag12[i] && tag12[i] > 0) {\r\n obj.height = tag12[i];\r\n }\r\n } else if (iconId === 15) {\r\n // line_stack: Tag 11 = display count\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.displayCount = tag11[i];\r\n }\r\n } else if (iconId === 110) {\r\n // linear_knockback: Tag 10 = horizontal count, Tag 11 = vertical count\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.horizontalCount = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.verticalCount = tag11[i];\r\n }\r\n } else if (iconId === 17) {\r\n // donut: Tag 10 = arc angle, Tag 11 = inner radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n } else {\r\n // Default handling for arc angle and donut radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n }\r\n\r\n // Text content for text objects (icon ID 100)\r\n if (iconId === 100 && textContents.length > 0) {\r\n obj.text = textContents.shift();\r\n }\r\n\r\n // Flags from Tag 4: bits encode hidden, horizontal flip, vertical flip, locked\r\n // Bit 0 (0x01): visible (1) / hidden (0)\r\n // Bit 1 (0x02): horizontal flip\r\n // Bit 2 (0x04): vertical flip\r\n // Bit 3 (0x08): locked\r\n const objFlags = objectFlags[i] ?? 1;\r\n if ((objFlags & 0x01) === 0) {\r\n obj.hidden = true;\r\n }\r\n if (objFlags & 0x02) {\r\n obj.horizontalFlip = true;\r\n }\r\n if (objFlags & 0x04) {\r\n obj.verticalFlip = true;\r\n }\r\n if (objFlags & 0x08) {\r\n obj.locked = true;\r\n }\r\n\r\n objects.push(obj);\r\n }\r\n\r\n return {\r\n version,\r\n name: name || undefined,\r\n boardBackground: BOARD_BACKGROUND_TYPES[boardBackground] as BackgroundType ?? 'none',\r\n objects,\r\n };\r\n}\r\n\r\n/**\r\n * Builds binary payload from sanitized board data.\r\n *\r\n * @param data - Sanitized board data from validation\r\n * @returns Binary payload\r\n */\r\nexport function buildBinary(data: {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n}): Uint8Array {\r\n const { name, boardBackground, objects } = data;\r\n const n = objects.length;\r\n\r\n // Calculate required buffer size\r\n // Header: 0x24 bytes (36 bytes)\r\n // Tag 2 entries: n * 4 bytes\r\n // Tag 4: 8 bytes for single, 6 + n*2 for multi\r\n // Tag 5 (positions): 6 + n * 4\r\n // Tag 6 (backgrounds): 6 + n * 2\r\n // Tag 7 (sizes): 6 + n + (n % 2 === 1 ? 1 : 0) padding\r\n // Tag 8 (colors): 6 + n * 4\r\n // Tag 10 (arc): 6 + n * 2\r\n // Tag 11 (donut): 6 + n * 2\r\n // Tag 12 (reserved): 6 + n * 2\r\n // Tag 3 (footer): 8\r\n const tag4Size = n <= 1 ? 8 : (6 + n * 2);\r\n const tag7Size = 6 + n + (n % 2 === 1 ? 1 : 0);\r\n const bufferSize = n === 0\r\n ? 0x24 + 8 // Header + footer only\r\n : 0x24 + n * 4 + tag4Size + (6 + n * 4) + (6 + n * 2) + tag7Size + (6 + n * 4) + (6 + n * 2) + (6 + n * 2) + (6 + n * 2) + 8;\r\n\r\n const buffer = new ArrayBuffer(bufferSize);\r\n const view = new DataView(buffer);\r\n let pos = 0;\r\n\r\n // Helper to write values\r\n const writeUint8 = (val: number) => {\r\n view.setUint8(pos, val);\r\n pos += 1;\r\n };\r\n const writeUint16 = (val: number) => {\r\n view.setUint16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeInt16 = (val: number) => {\r\n view.setInt16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeUint32 = (val: number) => {\r\n view.setUint32(pos, val, true);\r\n pos += 4;\r\n };\r\n\r\n // Header (0x00 - 0x23)\r\n writeUint32(2); // Version\r\n writeUint32(0); // Field at 0x04 - will update\r\n for (let i = 0; i < 10; i++) writeUint8(0); // Padding\r\n writeUint32(0); // Payload size - will update\r\n writeUint16(0); // Padding\r\n writeUint16(1); // Object count header\r\n writeUint16(8); // Name length\r\n\r\n // Name (8 bytes, null-padded)\r\n const nameBytes = new TextEncoder().encode(name.slice(0, 7));\r\n for (let i = 0; i < 8; i++) {\r\n writeUint8(nameBytes[i] ?? 0);\r\n }\r\n\r\n // Object list (Tag 2 entries)\r\n for (const obj of objects) {\r\n writeUint16(2);\r\n writeUint16(obj.typeId);\r\n }\r\n\r\n // Skip property tags for empty boards\r\n if (n === 0) {\r\n // Just write footer\r\n } else if (n === 1) {\r\n // Tag 4 - Single object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n const obj = objects[0];\r\n let flagsVal = 1; // visible\r\n if (obj.hidden) {\r\n flagsVal = 0;\r\n } else if (obj.locked) {\r\n flagsVal = 9;\r\n }\r\n writeUint16(1);\r\n writeUint16(flagsVal);\r\n } else {\r\n // Tag 4 - Multi-object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(1);\r\n }\r\n }\r\n\r\n // Only write property tags if there are objects\r\n if (n > 0) {\r\n // Tag 5 - Positions\r\n writeUint16(5);\r\n writeUint16(3);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeInt16(Math.round(obj.x * 10));\r\n writeInt16(Math.round(obj.y * 10));\r\n }\r\n\r\n // Tag 6 - Object backgrounds\r\n writeUint16(6);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.background);\r\n }\r\n\r\n // Tag 7 - Sizes\r\n writeUint16(7);\r\n writeUint16(0);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.size & 0xff);\r\n }\r\n // Padding if odd count\r\n if (n % 2 === 1) {\r\n writeUint8(0);\r\n }\r\n\r\n // Tag 8 - Colors\r\n writeUint16(8);\r\n writeUint16(2);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.colorR);\r\n writeUint8(obj.colorG);\r\n writeUint8(obj.colorB);\r\n writeUint8(obj.transparency);\r\n }\r\n\r\n // Tag 10 - Arc angles\r\n writeUint16(10);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.arcAngle);\r\n }\r\n\r\n // Tag 11 - Donut radii\r\n writeUint16(11);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.donutRadius);\r\n }\r\n\r\n // Tag 12 - Reserved\r\n writeUint16(12);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(0);\r\n }\r\n }\r\n\r\n // Tag 3 - Footer\r\n writeUint16(3);\r\n writeUint16(1);\r\n writeUint16(1);\r\n writeUint16(boardBackground);\r\n\r\n // Trim to actual size\r\n const result = new Uint8Array(buffer, 0, pos);\r\n\r\n // Update sizes in header\r\n const headerView = new DataView(result.buffer, result.byteOffset, result.byteLength);\r\n const payloadSize = pos - 0x1c;\r\n headerView.setUint32(0x12, payloadSize, true);\r\n const field04 = pos - 16;\r\n headerView.setUint32(0x04, field04, true);\r\n\r\n return result;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher encoding and decoding (obfuscation layer).\r\n */\r\n\r\nimport pako from 'pako';\r\nimport {\r\n CIPHER_TABLE,\r\n KEY_REVERSE,\r\n INVERSE_MAPPING,\r\n FORWARD_MAPPING,\r\n} from './constants';\r\n\r\n/**\r\n * Converts a standard Base64 character to its 6-bit value (0-63).\r\n *\r\n * @param c - Single character\r\n * @returns 6-bit value\r\n */\r\nexport function charToBase64Value(c: string): number {\r\n const o = c.charCodeAt(0);\r\n\r\n // A-Z = 0-25\r\n if (o >= 65 && o <= 90) return o - 65;\r\n // a-z = 26-51\r\n if (o >= 97 && o <= 122) return o - 71;\r\n // 0-9 = 52-61\r\n if (o >= 48 && o <= 57) return o + 4;\r\n // URL-safe variants\r\n if (c === '-') return 62;\r\n if (c === '_') return 63;\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Converts a 6-bit value (0-63) to a standard Base64 character.\r\n *\r\n * @param val - 6-bit value\r\n * @returns Base64 character\r\n */\r\nexport function base64ValueToChar(val: number): string {\r\n val = val & 63; // Ensure 6-bit range\r\n\r\n if (val < 26) return String.fromCharCode(val + 65); // A-Z\r\n if (val < 52) return String.fromCharCode(val + 71); // a-z\r\n if (val < 62) return String.fromCharCode(val - 4); // 0-9\r\n if (val === 62) return '-';\r\n if (val === 63) return '_';\r\n\r\n return 'A';\r\n}\r\n\r\n/**\r\n * Decodes an obfuscated share code string to binary data.\r\n *\r\n * @param stgyString - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decompressed binary data\r\n * @throws {Error} If decoding fails\r\n */\r\nexport function decodeCipher(stgyString: string): Uint8Array {\r\n // Extract body: [stgy:a<body>]\r\n const data = stgyString.slice(7, -1);\r\n\r\n if (data.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // First character encodes the cipher key\r\n const keyChar = data[0];\r\n const keyCharCode = keyChar.charCodeAt(0);\r\n\r\n if (keyCharCode >= CIPHER_TABLE.length) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMapped = CIPHER_TABLE[keyCharCode];\r\n if (keyMapped === 0) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMappedChar = String.fromCharCode(keyMapped);\r\n const key = charToBase64Value(keyMappedChar);\r\n\r\n // Decode remaining characters\r\n const decoded: string[] = [];\r\n\r\n for (let i = 0; i < data.length - 1; i++) {\r\n const c = data[i + 1];\r\n const charCode = c.charCodeAt(0);\r\n\r\n // Apply inverse substitution\r\n const standardCharCode = INVERSE_MAPPING[charCode] ?? 65; // Default to 'A'\r\n const standardChar = String.fromCharCode(standardCharCode);\r\n\r\n // Get base64 value and apply reverse shift\r\n const val = charToBase64Value(standardChar);\r\n const decodedVal = (val - i - key) & 63;\r\n\r\n decoded.push(base64ValueToChar(decodedVal));\r\n }\r\n\r\n // Convert URL-safe Base64 to standard Base64\r\n let b64String = decoded.join('').replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // Add proper padding based on length\r\n const padLength = (4 - (b64String.length % 4)) % 4;\r\n b64String += '='.repeat(padLength);\r\n\r\n // Decode Base64\r\n const binaryString = atob(b64String);\r\n const binaryData = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n binaryData[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Skip 6-byte header and decompress\r\n if (binaryData.length < 7) {\r\n throw new Error('Binary data is too short');\r\n }\r\n\r\n try {\r\n const compressed = binaryData.slice(6);\r\n return pako.inflate(compressed);\r\n } catch (e) {\r\n throw new Error(`Failed to decompress data: ${e instanceof Error ? e.message : 'unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Encodes binary data to an obfuscated share code string.\r\n *\r\n * @param binaryData - Binary data to encode\r\n * @param key - Optional cipher key (0-63), random if not provided\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n */\r\nexport function encodeCipher(binaryData: Uint8Array, key?: number): string {\r\n // Compress the data\r\n const compressed = pako.deflate(binaryData, { level: 6 });\r\n\r\n // Build header: [u32 checksum][u16 length]\r\n const length = binaryData.length;\r\n const lengthBytes = new Uint8Array(2);\r\n lengthBytes[0] = length & 0xff;\r\n lengthBytes[1] = (length >> 8) & 0xff;\r\n\r\n // Calculate CRC32 of length + compressed data\r\n const checksumInput = new Uint8Array(2 + compressed.length);\r\n checksumInput.set(lengthBytes, 0);\r\n checksumInput.set(compressed, 2);\r\n const checksum = crc32(checksumInput);\r\n\r\n // Build full payload: header + compressed\r\n const fullData = new Uint8Array(6 + compressed.length);\r\n fullData[0] = checksum & 0xff;\r\n fullData[1] = (checksum >> 8) & 0xff;\r\n fullData[2] = (checksum >> 16) & 0xff;\r\n fullData[3] = (checksum >> 24) & 0xff;\r\n fullData[4] = lengthBytes[0];\r\n fullData[5] = lengthBytes[1];\r\n fullData.set(compressed, 6);\r\n\r\n // Convert to Base64\r\n let b64 = '';\r\n for (let i = 0; i < fullData.length; i++) {\r\n b64 += String.fromCharCode(fullData[i]);\r\n }\r\n b64 = btoa(b64);\r\n\r\n // Convert to URL-safe Base64 and remove padding\r\n b64 = b64.replace(/=+$/, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n\r\n // Use provided key or generate random\r\n if (key === undefined || key < 0 || key > 63) {\r\n key = Math.floor(Math.random() * 64);\r\n }\r\n\r\n // Get key character for output\r\n const keyCharStandard = base64ValueToChar(key);\r\n const keyCharCode = keyCharStandard.charCodeAt(0);\r\n const keySource = KEY_REVERSE[keyCharCode] ?? 86; // Default to 'V'\r\n\r\n // Encode each character\r\n const encoded: string[] = [];\r\n\r\n for (let i = 0; i < b64.length; i++) {\r\n const c = b64[i];\r\n const val = charToBase64Value(c);\r\n const encodedVal = (val + i + key) & 63;\r\n const standardChar = base64ValueToChar(encodedVal);\r\n const standardCharCode = standardChar.charCodeAt(0);\r\n const substChar = FORWARD_MAPPING[standardCharCode] ?? 65; // Default to 'A'\r\n encoded.push(String.fromCharCode(substChar));\r\n }\r\n\r\n return `[stgy:a${String.fromCharCode(keySource)}${encoded.join('')}]`;\r\n}\r\n\r\n/**\r\n * CRC32 implementation (same as zlib.crc32).\r\n */\r\nfunction crc32(data: Uint8Array): number {\r\n let crc = 0xffffffff;\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n crc ^= data[i];\r\n for (let j = 0; j < 8; j++) {\r\n if (crc & 1) {\r\n crc = (crc >>> 1) ^ 0xedb88320;\r\n } else {\r\n crc = crc >>> 1;\r\n }\r\n }\r\n }\r\n\r\n return (crc ^ 0xffffffff) >>> 0;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board encoder (JSON → share code).\r\n */\r\n\r\nimport type { StrategyBoard, EncodeOptions } from './types';\r\nimport { sanitizeBoard } from './validation';\r\nimport { buildBinary } from './binary';\r\nimport { encodeCipher } from './cipher';\r\n\r\n/**\r\n * Encodes a strategy board to a share code.\r\n *\r\n * @param board - Strategy board to encode\r\n * @param options - Optional encoding options\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n * @throws {Error} If board data is invalid\r\n *\r\n * @example\r\n * ```ts\r\n * import { encode } from 'xiv-strat-board';\r\n *\r\n * const shareCode = encode({\r\n * name: 'myboard',\r\n * boardBackground: 'checkered',\r\n * objects: [\r\n * { type: 'tank', x: 256, y: 192, size: 100 },\r\n * { type: 'healer', x: 300, y: 192, size: 100 },\r\n * ],\r\n * });\r\n *\r\n * console.log(shareCode); // \"[stgy:a...]\"\r\n * ```\r\n */\r\nexport function encode(board: StrategyBoard, options?: EncodeOptions): string {\r\n // Validate and sanitize input\r\n const sanitized = sanitizeBoard(board);\r\n\r\n // Build binary format\r\n const binary = buildBinary(sanitized);\r\n\r\n // Encode with cipher\r\n return encodeCipher(binary, options?.key);\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board decoder (share code → JSON).\r\n */\r\n\r\nimport type { DecodeResult } from './types';\r\nimport { validateShareCode } from './validation';\r\nimport { decodeCipher } from './cipher';\r\nimport { parseBinary } from './binary';\r\n\r\n/**\r\n * Decodes a share code to a strategy board.\r\n *\r\n * @param shareCode - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decoded strategy board\r\n * @throws {Error} If share code is invalid or malformed\r\n *\r\n * @example\r\n * ```ts\r\n * import { decode } from 'xiv-strat-board';\r\n *\r\n * const board = decode('[stgy:aVe......]');\r\n *\r\n * console.log(board.name);\r\n * console.log(board.objects.length);\r\n * for (const obj of board.objects) {\r\n * console.log(`${obj.type} at (${obj.x}, ${obj.y})`);\r\n * }\r\n * ```\r\n */\r\nexport function decode(shareCode: string): DecodeResult {\r\n // Validate share code format\r\n validateShareCode(shareCode);\r\n\r\n // Decode cipher and decompress\r\n const binary = decodeCipher(shareCode);\r\n\r\n // Parse binary format\r\n return parseBinary(binary);\r\n}\r\n"]}
package/dist/index.js CHANGED
@@ -803,10 +803,12 @@ function parseBinary(data) {
803
803
  obj.background = bgName ?? backgrounds[i];
804
804
  }
805
805
  const colorableTypes = /* @__PURE__ */ new Set([11, 12, 100]);
806
- if (colors[i] && colorableTypes.has(iconId)) {
806
+ if (colors[i]) {
807
807
  const { r, g, b, a } = colors[i];
808
- const hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
809
- obj.color = hex;
808
+ if (colorableTypes.has(iconId)) {
809
+ const hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
810
+ obj.color = hex;
811
+ }
810
812
  if (a > 0) {
811
813
  obj.transparency = a;
812
814
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/validation.ts","../src/binary.ts","../src/cipher.ts","../src/encoder.ts","../src/decoder.ts"],"names":[],"mappings":"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AAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC7D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC5D,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC7D,GAAA,EAAK,GAAA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","file":"index.js","sourcesContent":["/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher tables and icon/background mappings from game data.\r\n */\r\n\r\n/**\r\n * Cipher lookup table (DAT_1420cf520 from game binary).\r\n * Used to decode the key character in share codes.\r\n */\r\nexport const CIPHER_TABLE = new Uint8Array([\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 80, 0, 0,\r\n 120, 103, 48, 75, 56, 83, 74, 50, 115, 90, 0, 0, 0, 0, 0, 0,\r\n 0, 68, 70, 116, 84, 54, 69, 97, 86, 99, 112, 76, 77, 109, 101, 106,\r\n 57, 88, 66, 52, 82, 89, 55, 95, 110, 79, 98, 0, 0, 0, 0, 0,\r\n 0, 105, 45, 118, 72, 67, 65, 114, 87, 111, 100, 73, 113, 104, 85, 108,\r\n 107, 51, 102, 121, 53, 71, 119, 49, 117, 122, 81, 0, 0, 0, 0, 0,\r\n]);\r\n\r\n/**\r\n * Reverse mapping of CIPHER_TABLE for encoding.\r\n * Maps output character code -> input character code.\r\n */\r\nexport const KEY_REVERSE: Record<number, number> = {};\r\nfor (let i = 0; i < CIPHER_TABLE.length; i++) {\r\n if (CIPHER_TABLE[i] !== 0) {\r\n KEY_REVERSE[CIPHER_TABLE[i]] = i;\r\n }\r\n}\r\n\r\n/**\r\n * Inverse character substitution mapping.\r\n * Maps obfuscated character code -> standard Base64 character code.\r\n */\r\nexport const INVERSE_MAPPING: Record<number, number> = {\r\n 98: 45, 50: 48, 119: 49, 55: 50, 113: 51, 83: 52, 116: 53, 69: 54,\r\n 86: 55, 52: 56, 80: 57, 102: 65, 82: 66, 101: 67, 65: 68, 70: 69,\r\n 66: 70, 117: 71, 100: 72, 107: 73, 54: 74, 51: 75, 75: 76, 76: 77,\r\n 43: 78, 89: 79, 45: 80, 122: 81, 84: 82, 53: 83, 68: 84, 110: 85,\r\n 72: 86, 104: 87, 81: 88, 85: 89, 57: 90, 87: 95, 71: 97, 90: 98,\r\n 73: 99, 106: 100, 78: 101, 114: 102, 49: 103, 109: 104, 97: 105,\r\n 79: 106, 112: 107, 111: 108, 77: 109, 88: 110, 105: 111, 74: 112,\r\n 108: 113, 103: 114, 56: 115, 67: 116, 120: 117, 99: 118, 118: 119,\r\n 48: 120, 115: 121, 121: 122,\r\n};\r\n\r\n/**\r\n * Forward character substitution mapping (reverse of INVERSE_MAPPING).\r\n * Maps standard Base64 character code -> obfuscated character code.\r\n */\r\nexport const FORWARD_MAPPING: Record<number, number> = {};\r\nfor (const [k, v] of Object.entries(INVERSE_MAPPING)) {\r\n FORWARD_MAPPING[v] = Number(k);\r\n}\r\n\r\n/**\r\n * Icon type name to numeric ID mapping.\r\n * Complete list from stgy.csv game data.\r\n */\r\nexport const ICON_TYPE_IDS: Record<string, number> = {\r\n // Field backgrounds (type 1)\r\n checkered_circle: 4,\r\n checkered_square: 8,\r\n grey_circle: 124,\r\n grey_square: 125,\r\n\r\n // AoE/Mechanics (type 6)\r\n circle_aoe: 9,\r\n fan_aoe: 10,\r\n line_aoe: 11,\r\n line: 12,\r\n gaze: 13,\r\n stack: 14,\r\n line_stack: 15,\r\n proximity: 16,\r\n donut: 17,\r\n stack_multi: 106,\r\n proximity_player: 107,\r\n tankbuster: 108,\r\n radial_knockback: 109,\r\n linear_knockback: 110,\r\n tower: 111,\r\n targeting: 112,\r\n moving_circle_aoe: 126,\r\n '1person_aoe': 127,\r\n '2person_aoe': 128,\r\n '3person_aoe': 129,\r\n '4person_aoe': 130,\r\n\r\n // Base classes (type 2)\r\n gladiator: 18,\r\n pugilist: 19,\r\n marauder: 20,\r\n lancer: 21,\r\n archer: 22,\r\n conjurer: 23,\r\n thaumaturge: 24,\r\n arcanist: 25,\r\n rogue: 26,\r\n\r\n // Jobs (type 2)\r\n paladin: 27,\r\n monk: 28,\r\n warrior: 29,\r\n dragoon: 30,\r\n bard: 31,\r\n white_mage: 32,\r\n black_mage: 33,\r\n summoner: 34,\r\n scholar: 35,\r\n ninja: 36,\r\n machinist: 37,\r\n dark_knight: 38,\r\n astrologian: 39,\r\n samurai: 40,\r\n red_mage: 41,\r\n blue_mage: 42,\r\n gunbreaker: 43,\r\n dancer: 44,\r\n reaper: 45,\r\n sage: 46,\r\n viper: 101,\r\n pictomancer: 102,\r\n\r\n // Role markers (type 2)\r\n tank: 47,\r\n tank_1: 48,\r\n tank_2: 49,\r\n healer: 50,\r\n healer_1: 51,\r\n healer_2: 52,\r\n dps: 53,\r\n dps_1: 54,\r\n dps_2: 55,\r\n dps_3: 56,\r\n dps_4: 57,\r\n melee_dps: 118,\r\n ranged_dps: 119,\r\n physical_ranged_dps: 120,\r\n magical_ranged_dps: 121,\r\n pure_healer: 122,\r\n barrier_healer: 123,\r\n\r\n // Enemies (type 3)\r\n small_enemy: 60,\r\n medium_enemy: 62,\r\n large_enemy: 64,\r\n\r\n // Target markers (type 3)\r\n attack_1: 65,\r\n attack_2: 66,\r\n attack_3: 67,\r\n attack_4: 68,\r\n attack_5: 69,\r\n attack_6: 115,\r\n attack_7: 116,\r\n attack_8: 117,\r\n bind_1: 70,\r\n bind_2: 71,\r\n bind_3: 72,\r\n ignore_1: 73,\r\n ignore_2: 74,\r\n\r\n // Chain markers (type 3)\r\n square_marker: 75,\r\n circle_marker: 76,\r\n plus_marker: 77,\r\n triangle_marker: 78,\r\n\r\n // Waymarks (type 3)\r\n waymark_a: 79,\r\n waymark_b: 80,\r\n waymark_c: 81,\r\n waymark_d: 82,\r\n waymark_1: 83,\r\n waymark_2: 84,\r\n waymark_3: 85,\r\n waymark_4: 86,\r\n\r\n // Shapes (type 4)\r\n shape_circle: 87,\r\n shape_x: 88,\r\n shape_triangle: 89,\r\n shape_square: 90,\r\n up_arrow: 94,\r\n text: 100,\r\n rotate: 103,\r\n highlighted_circle: 135,\r\n highlighted_x: 136,\r\n highlighted_square: 137,\r\n highlighted_triangle: 138,\r\n rotate_clockwise: 139,\r\n rotate_counterclockwise: 140,\r\n\r\n // Effects (type 3)\r\n enhancement: 113,\r\n enfeeblement: 114,\r\n\r\n // Lock-on markers (type 3)\r\n lockon_red: 131,\r\n lockon_blue: 132,\r\n lockon_purple: 133,\r\n lockon_green: 134,\r\n\r\n // Groups (type 5)\r\n group: 105,\r\n};\r\n\r\n/**\r\n * Icon numeric ID to type name mapping (reverse of ICON_TYPE_IDS).\r\n */\r\nexport const ICON_TYPES: Record<number, string> = {};\r\nfor (const [name, id] of Object.entries(ICON_TYPE_IDS)) {\r\n ICON_TYPES[id] = name;\r\n}\r\n\r\n/**\r\n * Board background numeric ID to name mapping.\r\n * Used in Tag 3 footer.\r\n */\r\nexport const BOARD_BACKGROUND_TYPES: Record<number, string> = {\r\n 1: 'none',\r\n 2: 'checkered',\r\n 3: 'checkered_circle',\r\n 4: 'checkered_square',\r\n 5: 'grey',\r\n 6: 'grey_circle',\r\n 7: 'grey_square',\r\n};\r\n\r\n/**\r\n * Board background name to numeric ID mapping.\r\n */\r\nexport const BOARD_BACKGROUND_IDS: Record<string, number> = {\r\n none: 1,\r\n checkered: 2,\r\n checkered_circle: 3,\r\n checkered_square: 4,\r\n grey: 5,\r\n grey_circle: 6,\r\n grey_square: 7,\r\n};\r\n\r\n/**\r\n * Object background numeric ID to name mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_TYPES: Record<number, string> = {\r\n 0: 'none',\r\n 1: 'checkered',\r\n 2: 'checkered_circle',\r\n 3: 'checkered_square',\r\n 4: 'grey',\r\n 5: 'grey_circle',\r\n 6: 'grey_square',\r\n};\r\n\r\n/**\r\n * Object background name to numeric ID mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_IDS: Record<string, number> = {\r\n none: 0,\r\n checkered: 1,\r\n checkered_circle: 2,\r\n checkered_square: 3,\r\n grey: 4,\r\n grey_circle: 5,\r\n grey_square: 6,\r\n};\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Input validation and sanitization for secure public package usage.\r\n */\r\n\r\nimport type { StrategyBoard, StrategyObject } from './types';\r\nimport { ICON_TYPE_IDS, BOARD_BACKGROUND_IDS, OBJECT_BACKGROUND_IDS } from './constants';\r\n\r\n/**\r\n * Board coordinate and property bounds.\r\n */\r\nexport const BOUNDS = {\r\n /** Minimum X coordinate (allows slight overflow for edge objects) */\r\n minX: -100,\r\n /** Maximum X coordinate */\r\n maxX: 612,\r\n /** Minimum Y coordinate */\r\n minY: -100,\r\n /** Maximum Y coordinate */\r\n maxY: 484,\r\n /** Minimum size percentage */\r\n minSize: 1,\r\n /** Maximum size percentage */\r\n maxSize: 255,\r\n /** Minimum arc angle */\r\n minArc: 0,\r\n /** Maximum arc angle */\r\n maxArc: 360,\r\n /** Minimum donut radius */\r\n minDonut: 0,\r\n /** Maximum donut radius */\r\n maxDonut: 255,\r\n /** Maximum number of objects per board */\r\n maxObjects: 50,\r\n /** Maximum name length (bytes) */\r\n maxNameLength: 7,\r\n} as const;\r\n\r\n/**\r\n * Characters allowed in cipher-encoded body.\r\n */\r\nconst VALID_CIPHER_CHARS = new Set(\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-_'.split('')\r\n);\r\n\r\n/**\r\n * Validates the format of a share code string.\r\n *\r\n * @param code - The share code to validate\r\n * @throws {Error} If the share code format is invalid\r\n */\r\nexport function validateShareCode(code: string): void {\r\n if (typeof code !== 'string') {\r\n throw new Error('Share code must be a string');\r\n }\r\n\r\n if (code.length < 10) {\r\n throw new Error('Share code is too short');\r\n }\r\n\r\n if (code.length > 10000) {\r\n throw new Error('Share code is too long');\r\n }\r\n\r\n if (!code.startsWith('[stgy:a')) {\r\n throw new Error('Share code must start with \"[stgy:a\"');\r\n }\r\n\r\n if (!code.endsWith(']')) {\r\n throw new Error('Share code must end with \"]\"');\r\n }\r\n\r\n // Extract body (between [stgy:a and ])\r\n const body = code.slice(7, -1);\r\n\r\n if (body.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // Validate all characters in body\r\n for (const char of body) {\r\n if (!VALID_CIPHER_CHARS.has(char)) {\r\n throw new Error(`Invalid character in share code: \"${char}\"`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Clamps a number to a range.\r\n */\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a board name.\r\n * Only allows ASCII alphanumeric characters, truncates to max length.\r\n *\r\n * @param name - The name to sanitize\r\n * @returns Sanitized name\r\n */\r\nexport function sanitizeName(name: string | undefined): string {\r\n if (!name || typeof name !== 'string') {\r\n return 'board';\r\n }\r\n\r\n // Remove non-ASCII and control characters, keep alphanumeric and some safe chars\r\n const sanitized = name\r\n .replace(/[^\\x20-\\x7E]/g, '') // Only printable ASCII\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove filesystem-unsafe chars\r\n .trim()\r\n .slice(0, BOUNDS.maxNameLength);\r\n\r\n return sanitized || 'board';\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a coordinate value.\r\n *\r\n * @param value - The coordinate value\r\n * @param isX - Whether this is an X coordinate\r\n * @returns Sanitized coordinate\r\n */\r\nexport function sanitizeCoordinate(value: unknown, isX: boolean): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return isX ? 256 : 192; // Default to center\r\n }\r\n\r\n const min = isX ? BOUNDS.minX : BOUNDS.minY;\r\n const max = isX ? BOUNDS.maxX : BOUNDS.maxY;\r\n\r\n return clamp(Math.round(value * 10) / 10, min, max);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a size value.\r\n *\r\n * @param value - The size value\r\n * @returns Sanitized size (50-200 range, default 100)\r\n */\r\nexport function sanitizeSize(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 100;\r\n }\r\n return clamp(Math.round(value), BOUNDS.minSize, BOUNDS.maxSize);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a color component (0-255).\r\n */\r\nexport function sanitizeColorComponent(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 255;\r\n }\r\n return clamp(Math.round(value), 0, 255);\r\n}\r\n\r\n/**\r\n * Parses a hex color string to RGB components.\r\n *\r\n * @param color - Hex color string (e.g., '#FF0000' or 'FF0000')\r\n * @returns RGB components or null if invalid\r\n */\r\nexport function parseHexColor(color: string | undefined): { r: number; g: number; b: number } | null {\r\n if (!color || typeof color !== 'string') {\r\n return null;\r\n }\r\n\r\n // Remove # prefix if present\r\n const hex = color.replace(/^#/, '');\r\n\r\n // Validate hex format\r\n if (!/^[0-9A-Fa-f]{6}$/.test(hex)) {\r\n return null;\r\n }\r\n\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n}\r\n\r\n/**\r\n * Validates a background type value.\r\n */\r\nexport function validateBackground(value: unknown): number {\r\n if (typeof value === 'number') {\r\n if (value >= 0 && value <= 6) {\r\n return value;\r\n }\r\n return 0;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const id = OBJECT_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 0;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Validates a board background type value.\r\n */\r\nexport function validateBoardBackground(value: unknown): number {\r\n if (typeof value === 'string') {\r\n const id = BOARD_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 1;\r\n }\r\n\r\n if (typeof value === 'number' && value >= 1 && value <= 7) {\r\n return value;\r\n }\r\n\r\n return 1; // default: none\r\n}\r\n\r\n/**\r\n * Validates an icon type, returning the numeric ID.\r\n *\r\n * @param typeName - Icon type name or ID\r\n * @param typeId - Optional explicit type ID\r\n * @returns Numeric icon type ID\r\n * @throws {Error} If icon type is unknown\r\n */\r\nexport function validateIconType(typeName: string, typeId?: number): number {\r\n // Explicit typeId takes priority\r\n if (typeof typeId === 'number' && Number.isFinite(typeId) && typeId > 0 && typeId < 256) {\r\n return typeId;\r\n }\r\n\r\n // Look up by name\r\n const id = ICON_TYPE_IDS[typeName];\r\n if (id !== undefined) {\r\n return id;\r\n }\r\n\r\n // Try to parse as unknown_{id} format\r\n const unknownMatch = typeName.match(/^unknown_(\\d+)$/);\r\n if (unknownMatch) {\r\n const parsedId = parseInt(unknownMatch[1], 10);\r\n if (parsedId > 0 && parsedId < 256) {\r\n return parsedId;\r\n }\r\n }\r\n\r\n throw new Error(`Unknown icon type: \"${typeName}\"`);\r\n}\r\n\r\n/**\r\n * Sanitizes a single strategy object.\r\n *\r\n * @param obj - The object to sanitize\r\n * @param index - Object index for error messages\r\n * @returns Sanitized object data\r\n * @throws {Error} If object data is invalid\r\n */\r\nexport function sanitizeObject(\r\n obj: StrategyObject,\r\n index: number\r\n): {\r\n typeId: number;\r\n x: number;\r\n y: number;\r\n size: number;\r\n background: number;\r\n colorR: number;\r\n colorG: number;\r\n colorB: number;\r\n transparency: number;\r\n arcAngle: number;\r\n donutRadius: number;\r\n hidden: boolean;\r\n locked: boolean;\r\n} {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error(`Object at index ${index} is not a valid object`);\r\n }\r\n\r\n if (!obj.type && !obj.typeId) {\r\n throw new Error(`Object at index ${index} must have a type or typeId`);\r\n }\r\n\r\n const typeId = validateIconType(obj.type || '', obj.typeId);\r\n\r\n // Parse color from hex string or components\r\n let colorR = obj.colorR ?? 255;\r\n let colorG = obj.colorG ?? 255;\r\n let colorB = obj.colorB ?? 255;\r\n\r\n if (obj.color) {\r\n const parsed = parseHexColor(obj.color);\r\n if (parsed) {\r\n colorR = parsed.r;\r\n colorG = parsed.g;\r\n colorB = parsed.b;\r\n }\r\n }\r\n\r\n return {\r\n typeId,\r\n x: sanitizeCoordinate(obj.x, true),\r\n y: sanitizeCoordinate(obj.y, false),\r\n size: sanitizeSize(obj.size),\r\n background: validateBackground(obj.background),\r\n colorR: sanitizeColorComponent(colorR),\r\n colorG: sanitizeColorComponent(colorG),\r\n colorB: sanitizeColorComponent(colorB),\r\n transparency: sanitizeColorComponent(obj.transparency ?? 0),\r\n arcAngle: clamp(Math.round(obj.arcAngle ?? 0), BOUNDS.minArc, BOUNDS.maxArc),\r\n donutRadius: clamp(Math.round(obj.donutRadius ?? 0), BOUNDS.minDonut, BOUNDS.maxDonut),\r\n hidden: Boolean(obj.hidden),\r\n locked: Boolean(obj.locked),\r\n };\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a complete strategy board for encoding.\r\n *\r\n * @param board - The board to sanitize\r\n * @returns Sanitized board data ready for binary encoding\r\n * @throws {Error} If board data is invalid\r\n */\r\nexport function sanitizeBoard(board: StrategyBoard): {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n} {\r\n if (!board || typeof board !== 'object') {\r\n throw new Error('Board must be an object');\r\n }\r\n\r\n if (!Array.isArray(board.objects)) {\r\n throw new Error('Board must have an objects array');\r\n }\r\n\r\n if (board.objects.length > BOUNDS.maxObjects) {\r\n throw new Error(`Board has too many objects (max ${BOUNDS.maxObjects})`);\r\n }\r\n\r\n return {\r\n name: sanitizeName(board.name),\r\n boardBackground: validateBoardBackground(board.boardBackground),\r\n objects: board.objects.map((obj, i) => sanitizeObject(obj, i)),\r\n };\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Binary format builder and parser (TLV format).\r\n */\r\n\r\nimport type { DecodeResult, BackgroundType } from './types';\r\nimport {\r\n ICON_TYPES,\r\n BOARD_BACKGROUND_TYPES,\r\n OBJECT_BACKGROUND_TYPES,\r\n} from './constants';\r\nimport type { sanitizeObject } from './validation';\r\n\r\n/**\r\n * DataView wrapper for reading binary data with bounds checking.\r\n */\r\nclass BinaryReader {\r\n private view: DataView;\r\n private pos: number;\r\n\r\n constructor(data: Uint8Array) {\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.pos = 0;\r\n }\r\n\r\n get position(): number {\r\n return this.pos;\r\n }\r\n\r\n get length(): number {\r\n return this.view.byteLength;\r\n }\r\n\r\n get remaining(): number {\r\n return this.length - this.pos;\r\n }\r\n\r\n seek(pos: number): void {\r\n if (pos < 0 || pos > this.length) {\r\n throw new Error(`Seek position ${pos} out of bounds [0, ${this.length}]`);\r\n }\r\n this.pos = pos;\r\n }\r\n\r\n readUint8(): number {\r\n if (this.pos + 1 > this.length) {\r\n throw new Error('Unexpected end of data reading uint8');\r\n }\r\n const val = this.view.getUint8(this.pos);\r\n this.pos += 1;\r\n return val;\r\n }\r\n\r\n readInt16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading int16');\r\n }\r\n const val = this.view.getInt16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading uint16');\r\n }\r\n const val = this.view.getUint16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint32(): number {\r\n if (this.pos + 4 > this.length) {\r\n throw new Error('Unexpected end of data reading uint32');\r\n }\r\n const val = this.view.getUint32(this.pos, true); // little-endian\r\n this.pos += 4;\r\n return val;\r\n }\r\n\r\n readBytes(count: number): Uint8Array {\r\n if (this.pos + count > this.length) {\r\n throw new Error(`Unexpected end of data reading ${count} bytes`);\r\n }\r\n const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.pos, count);\r\n this.pos += count;\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Parses decompressed binary data into a strategy board structure.\r\n *\r\n * @param data - Decompressed binary data\r\n * @returns Parsed board structure\r\n * @throws {Error} If binary format is invalid\r\n */\r\nexport function parseBinary(data: Uint8Array): DecodeResult {\r\n if (data.length < 0x1C) {\r\n throw new Error('Binary data is too short for header');\r\n }\r\n\r\n const reader = new BinaryReader(data);\r\n\r\n // Parse header\r\n const version = reader.readUint32();\r\n\r\n // Skip fields at 0x04-0x17\r\n reader.seek(0x18);\r\n reader.readUint16(); // object_count_header (always 1)\r\n\r\n // Read name length at 0x1A\r\n const nameLength = reader.readUint16();\r\n\r\n if (data.length < 0x1C + nameLength) {\r\n throw new Error('Binary data is too short for name field');\r\n }\r\n\r\n // Read name at 0x1C with variable length\r\n const nameBytes = reader.readBytes(nameLength);\r\n const name = new TextDecoder('utf-8', { fatal: false })\r\n .decode(nameBytes)\r\n .replace(/\\0+$/, '')\r\n .trim();\r\n\r\n // Parse icon list (Tag 2 entries) with interleaved text content (Tag 3)\r\n // Text content appears immediately after text icons (iconId 100) in the stream\r\n const icons: number[] = [];\r\n const textContents: string[] = []; // Text content for text objects\r\n while (reader.remaining >= 4) {\r\n const marker = reader.readUint16();\r\n if (marker === 2) {\r\n // Icon entry\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (marker === 3) {\r\n // Tag 3: text content (length > 1) or footer indicator (length = 1)\r\n const val = reader.readUint16();\r\n if (val > 1) {\r\n // Text content - appears after text icon entries\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n } else {\r\n // Footer indicator (val === 1), rewind and let main loop handle it\r\n reader.seek(reader.position - 4);\r\n break;\r\n }\r\n } else {\r\n // Other tag, rewind and break to main tag parsing\r\n reader.seek(reader.position - 2);\r\n break;\r\n }\r\n }\r\n\r\n const n = icons.length;\r\n\r\n // Storage for object properties\r\n const positions: Array<{ x: number; y: number }> = [];\r\n const backgrounds: number[] = []; // Tag 6: also used for rotation angle in rotatable objects\r\n const sizes: number[] = [];\r\n const colors: Array<{ r: number; g: number; b: number; a: number }> = [];\r\n const tag10: number[] = []; // Tag 10: arc angle for fan_aoe, width for line_aoe, horiz count for knockback\r\n const tag11: number[] = []; // Tag 11: donut radius, height for line_aoe, vert count/display count\r\n const tag12: number[] = []; // Tag 12: reserved\r\n const objectFlags: number[] = []; // Per-object flags from Tag 4\r\n let boardBackground = 1; // default: none\r\n\r\n // Parse tags\r\n while (reader.remaining >= 2) {\r\n const tag = reader.readUint16();\r\n\r\n if (tag === 2) {\r\n // Additional icon entry (can appear after text content)\r\n if (reader.remaining < 2) break;\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (tag === 4) {\r\n // Object count header with flags\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const countVal = reader.readUint16();\r\n\r\n if (countVal > 1) {\r\n // Multi-object: read per-object flags\r\n if (reader.remaining < countVal * 2) break;\r\n for (let i = 0; i < countVal; i++) {\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else {\r\n // Single object: read flags\r\n if (reader.remaining < 2) break;\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else if (tag === 5) {\r\n // Positions\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 3\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const x = reader.readInt16() / 10;\r\n const y = reader.readInt16() / 10;\r\n positions.push({ x, y });\r\n }\r\n } else if (tag === 6) {\r\n // Object backgrounds / rotation angles (stored as signed i16)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n // Read as signed to support negative angles\r\n backgrounds.push(reader.readInt16());\r\n }\r\n } else if (tag === 7) {\r\n // Sizes (u8, packed)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 0\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 1; i++) {\r\n sizes.push(reader.readUint8());\r\n }\r\n\r\n // Skip padding byte if odd count\r\n if (count % 2 === 1 && reader.remaining >= 1) {\r\n reader.readUint8();\r\n }\r\n } else if (tag === 8) {\r\n // Colors (RGBA)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 2\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const r = reader.readUint8();\r\n const g = reader.readUint8();\r\n const b = reader.readUint8();\r\n const a = reader.readUint8();\r\n colors.push({ r, g, b, a });\r\n }\r\n } else if (tag === 10) {\r\n // Arc angles\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag10.push(reader.readUint16());\r\n }\r\n } else if (tag === 11) {\r\n // Donut radii\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag11.push(reader.readUint16());\r\n }\r\n } else if (tag === 12) {\r\n // Rotation angles (for line_aoe)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag12.push(reader.readUint16());\r\n }\r\n } else if (tag === 3) {\r\n // Tag 3 can be:\r\n // - Footer: [3][1][1][board_bg] when second value is 1\r\n // - Text content: [3][text_length][text_bytes...] when second value > 1\r\n if (reader.remaining < 2) break;\r\n const val = reader.readUint16();\r\n\r\n if (val === 1) {\r\n // This is the footer\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n boardBackground = reader.readUint16();\r\n break; // Footer is always last\r\n } else {\r\n // This is text content for a text object\r\n // val is the length of the text content\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n // Continue parsing other tags\r\n }\r\n } else {\r\n // Unknown tag, skip\r\n break;\r\n }\r\n }\r\n\r\n // Build objects array\r\n const objects: DecodeResult['objects'] = [];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const iconId = icons[i];\r\n const typeName = ICON_TYPES[iconId] ?? `unknown_${iconId}`;\r\n\r\n const obj: DecodeResult['objects'][0] = {\r\n type: typeName,\r\n typeId: iconId,\r\n x: positions[i]?.x ?? 0,\r\n y: positions[i]?.y ?? 0,\r\n };\r\n\r\n // Size\r\n obj.size = sizes[i] && sizes[i] > 0 ? sizes[i] : 100;\r\n\r\n // Background vs Angle handling\r\n // For rotatable objects (fan_aoe, line_aoe, line_stack, linear_knockback, line, etc.),\r\n // Tag 6 stores the rotation angle (as signed i16), not the background\r\n const rotatableTypes = new Set([10, 11, 12, 15, 16, 17, 18, 19, 110]); // fan_aoe, line_aoe, line, line_stack, etc.\r\n if (rotatableTypes.has(iconId)) {\r\n // Tag 6 is angle for rotatable objects (can be negative)\r\n if (backgrounds[i] !== undefined && backgrounds[i] !== 0) {\r\n obj.angle = backgrounds[i];\r\n }\r\n } else if (backgrounds[i] !== undefined && backgrounds[i] > 0) {\r\n // Tag 6 is background for non-rotatable objects\r\n const bgName = OBJECT_BACKGROUND_TYPES[backgrounds[i]];\r\n obj.background = bgName as BackgroundType ?? backgrounds[i];\r\n }\r\n\r\n // Color - only for objects with settable colors: line_aoe (11), line (12), text (100)\r\n const colorableTypes = new Set([11, 12, 100]);\r\n if (colors[i] && colorableTypes.has(iconId)) {\r\n const { r, g, b, a } = colors[i];\r\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n obj.color = hex;\r\n if (a > 0) {\r\n obj.transparency = a;\r\n }\r\n }\r\n\r\n // Type-specific handling of Tags 10, 11, 12\r\n if (iconId === 11) {\r\n // line_aoe: Tag 10 = width, Tag 11 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.width = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.height = tag11[i];\r\n }\r\n } else if (iconId === 10) {\r\n // fan_aoe: Tag 10 = arc angle\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n } else if (iconId === 12) {\r\n // line: Tag 10 = endX * 10, Tag 11 = endY * 10, Tag 12 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.endX = tag10[i] / 10;\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.endY = tag11[i] / 10;\r\n }\r\n if (tag12[i] && tag12[i] > 0) {\r\n obj.height = tag12[i];\r\n }\r\n } else if (iconId === 15) {\r\n // line_stack: Tag 11 = display count\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.displayCount = tag11[i];\r\n }\r\n } else if (iconId === 110) {\r\n // linear_knockback: Tag 10 = horizontal count, Tag 11 = vertical count\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.horizontalCount = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.verticalCount = tag11[i];\r\n }\r\n } else if (iconId === 17) {\r\n // donut: Tag 10 = arc angle, Tag 11 = inner radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n } else {\r\n // Default handling for arc angle and donut radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n }\r\n\r\n // Text content for text objects (icon ID 100)\r\n if (iconId === 100 && textContents.length > 0) {\r\n obj.text = textContents.shift();\r\n }\r\n\r\n // Flags from Tag 4: bits encode hidden, horizontal flip, vertical flip, locked\r\n // Bit 0 (0x01): visible (1) / hidden (0)\r\n // Bit 1 (0x02): horizontal flip\r\n // Bit 2 (0x04): vertical flip\r\n // Bit 3 (0x08): locked\r\n const objFlags = objectFlags[i] ?? 1;\r\n if ((objFlags & 0x01) === 0) {\r\n obj.hidden = true;\r\n }\r\n if (objFlags & 0x02) {\r\n obj.horizontalFlip = true;\r\n }\r\n if (objFlags & 0x04) {\r\n obj.verticalFlip = true;\r\n }\r\n if (objFlags & 0x08) {\r\n obj.locked = true;\r\n }\r\n\r\n objects.push(obj);\r\n }\r\n\r\n return {\r\n version,\r\n name: name || undefined,\r\n boardBackground: BOARD_BACKGROUND_TYPES[boardBackground] as BackgroundType ?? 'none',\r\n objects,\r\n };\r\n}\r\n\r\n/**\r\n * Builds binary payload from sanitized board data.\r\n *\r\n * @param data - Sanitized board data from validation\r\n * @returns Binary payload\r\n */\r\nexport function buildBinary(data: {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n}): Uint8Array {\r\n const { name, boardBackground, objects } = data;\r\n const n = objects.length;\r\n\r\n // Calculate required buffer size\r\n // Header: 0x24 bytes (36 bytes)\r\n // Tag 2 entries: n * 4 bytes\r\n // Tag 4: 8 bytes for single, 6 + n*2 for multi\r\n // Tag 5 (positions): 6 + n * 4\r\n // Tag 6 (backgrounds): 6 + n * 2\r\n // Tag 7 (sizes): 6 + n + (n % 2 === 1 ? 1 : 0) padding\r\n // Tag 8 (colors): 6 + n * 4\r\n // Tag 10 (arc): 6 + n * 2\r\n // Tag 11 (donut): 6 + n * 2\r\n // Tag 12 (reserved): 6 + n * 2\r\n // Tag 3 (footer): 8\r\n const tag4Size = n <= 1 ? 8 : (6 + n * 2);\r\n const tag7Size = 6 + n + (n % 2 === 1 ? 1 : 0);\r\n const bufferSize = n === 0\r\n ? 0x24 + 8 // Header + footer only\r\n : 0x24 + n * 4 + tag4Size + (6 + n * 4) + (6 + n * 2) + tag7Size + (6 + n * 4) + (6 + n * 2) + (6 + n * 2) + (6 + n * 2) + 8;\r\n\r\n const buffer = new ArrayBuffer(bufferSize);\r\n const view = new DataView(buffer);\r\n let pos = 0;\r\n\r\n // Helper to write values\r\n const writeUint8 = (val: number) => {\r\n view.setUint8(pos, val);\r\n pos += 1;\r\n };\r\n const writeUint16 = (val: number) => {\r\n view.setUint16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeInt16 = (val: number) => {\r\n view.setInt16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeUint32 = (val: number) => {\r\n view.setUint32(pos, val, true);\r\n pos += 4;\r\n };\r\n\r\n // Header (0x00 - 0x23)\r\n writeUint32(2); // Version\r\n writeUint32(0); // Field at 0x04 - will update\r\n for (let i = 0; i < 10; i++) writeUint8(0); // Padding\r\n writeUint32(0); // Payload size - will update\r\n writeUint16(0); // Padding\r\n writeUint16(1); // Object count header\r\n writeUint16(8); // Name length\r\n\r\n // Name (8 bytes, null-padded)\r\n const nameBytes = new TextEncoder().encode(name.slice(0, 7));\r\n for (let i = 0; i < 8; i++) {\r\n writeUint8(nameBytes[i] ?? 0);\r\n }\r\n\r\n // Object list (Tag 2 entries)\r\n for (const obj of objects) {\r\n writeUint16(2);\r\n writeUint16(obj.typeId);\r\n }\r\n\r\n // Skip property tags for empty boards\r\n if (n === 0) {\r\n // Just write footer\r\n } else if (n === 1) {\r\n // Tag 4 - Single object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n const obj = objects[0];\r\n let flagsVal = 1; // visible\r\n if (obj.hidden) {\r\n flagsVal = 0;\r\n } else if (obj.locked) {\r\n flagsVal = 9;\r\n }\r\n writeUint16(1);\r\n writeUint16(flagsVal);\r\n } else {\r\n // Tag 4 - Multi-object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(1);\r\n }\r\n }\r\n\r\n // Only write property tags if there are objects\r\n if (n > 0) {\r\n // Tag 5 - Positions\r\n writeUint16(5);\r\n writeUint16(3);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeInt16(Math.round(obj.x * 10));\r\n writeInt16(Math.round(obj.y * 10));\r\n }\r\n\r\n // Tag 6 - Object backgrounds\r\n writeUint16(6);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.background);\r\n }\r\n\r\n // Tag 7 - Sizes\r\n writeUint16(7);\r\n writeUint16(0);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.size & 0xff);\r\n }\r\n // Padding if odd count\r\n if (n % 2 === 1) {\r\n writeUint8(0);\r\n }\r\n\r\n // Tag 8 - Colors\r\n writeUint16(8);\r\n writeUint16(2);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.colorR);\r\n writeUint8(obj.colorG);\r\n writeUint8(obj.colorB);\r\n writeUint8(obj.transparency);\r\n }\r\n\r\n // Tag 10 - Arc angles\r\n writeUint16(10);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.arcAngle);\r\n }\r\n\r\n // Tag 11 - Donut radii\r\n writeUint16(11);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.donutRadius);\r\n }\r\n\r\n // Tag 12 - Reserved\r\n writeUint16(12);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(0);\r\n }\r\n }\r\n\r\n // Tag 3 - Footer\r\n writeUint16(3);\r\n writeUint16(1);\r\n writeUint16(1);\r\n writeUint16(boardBackground);\r\n\r\n // Trim to actual size\r\n const result = new Uint8Array(buffer, 0, pos);\r\n\r\n // Update sizes in header\r\n const headerView = new DataView(result.buffer, result.byteOffset, result.byteLength);\r\n const payloadSize = pos - 0x1c;\r\n headerView.setUint32(0x12, payloadSize, true);\r\n const field04 = pos - 16;\r\n headerView.setUint32(0x04, field04, true);\r\n\r\n return result;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher encoding and decoding (obfuscation layer).\r\n */\r\n\r\nimport pako from 'pako';\r\nimport {\r\n CIPHER_TABLE,\r\n KEY_REVERSE,\r\n INVERSE_MAPPING,\r\n FORWARD_MAPPING,\r\n} from './constants';\r\n\r\n/**\r\n * Converts a standard Base64 character to its 6-bit value (0-63).\r\n *\r\n * @param c - Single character\r\n * @returns 6-bit value\r\n */\r\nexport function charToBase64Value(c: string): number {\r\n const o = c.charCodeAt(0);\r\n\r\n // A-Z = 0-25\r\n if (o >= 65 && o <= 90) return o - 65;\r\n // a-z = 26-51\r\n if (o >= 97 && o <= 122) return o - 71;\r\n // 0-9 = 52-61\r\n if (o >= 48 && o <= 57) return o + 4;\r\n // URL-safe variants\r\n if (c === '-') return 62;\r\n if (c === '_') return 63;\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Converts a 6-bit value (0-63) to a standard Base64 character.\r\n *\r\n * @param val - 6-bit value\r\n * @returns Base64 character\r\n */\r\nexport function base64ValueToChar(val: number): string {\r\n val = val & 63; // Ensure 6-bit range\r\n\r\n if (val < 26) return String.fromCharCode(val + 65); // A-Z\r\n if (val < 52) return String.fromCharCode(val + 71); // a-z\r\n if (val < 62) return String.fromCharCode(val - 4); // 0-9\r\n if (val === 62) return '-';\r\n if (val === 63) return '_';\r\n\r\n return 'A';\r\n}\r\n\r\n/**\r\n * Decodes an obfuscated share code string to binary data.\r\n *\r\n * @param stgyString - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decompressed binary data\r\n * @throws {Error} If decoding fails\r\n */\r\nexport function decodeCipher(stgyString: string): Uint8Array {\r\n // Extract body: [stgy:a<body>]\r\n const data = stgyString.slice(7, -1);\r\n\r\n if (data.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // First character encodes the cipher key\r\n const keyChar = data[0];\r\n const keyCharCode = keyChar.charCodeAt(0);\r\n\r\n if (keyCharCode >= CIPHER_TABLE.length) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMapped = CIPHER_TABLE[keyCharCode];\r\n if (keyMapped === 0) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMappedChar = String.fromCharCode(keyMapped);\r\n const key = charToBase64Value(keyMappedChar);\r\n\r\n // Decode remaining characters\r\n const decoded: string[] = [];\r\n\r\n for (let i = 0; i < data.length - 1; i++) {\r\n const c = data[i + 1];\r\n const charCode = c.charCodeAt(0);\r\n\r\n // Apply inverse substitution\r\n const standardCharCode = INVERSE_MAPPING[charCode] ?? 65; // Default to 'A'\r\n const standardChar = String.fromCharCode(standardCharCode);\r\n\r\n // Get base64 value and apply reverse shift\r\n const val = charToBase64Value(standardChar);\r\n const decodedVal = (val - i - key) & 63;\r\n\r\n decoded.push(base64ValueToChar(decodedVal));\r\n }\r\n\r\n // Convert URL-safe Base64 to standard Base64\r\n let b64String = decoded.join('').replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // Add proper padding based on length\r\n const padLength = (4 - (b64String.length % 4)) % 4;\r\n b64String += '='.repeat(padLength);\r\n\r\n // Decode Base64\r\n const binaryString = atob(b64String);\r\n const binaryData = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n binaryData[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Skip 6-byte header and decompress\r\n if (binaryData.length < 7) {\r\n throw new Error('Binary data is too short');\r\n }\r\n\r\n try {\r\n const compressed = binaryData.slice(6);\r\n return pako.inflate(compressed);\r\n } catch (e) {\r\n throw new Error(`Failed to decompress data: ${e instanceof Error ? e.message : 'unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Encodes binary data to an obfuscated share code string.\r\n *\r\n * @param binaryData - Binary data to encode\r\n * @param key - Optional cipher key (0-63), random if not provided\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n */\r\nexport function encodeCipher(binaryData: Uint8Array, key?: number): string {\r\n // Compress the data\r\n const compressed = pako.deflate(binaryData, { level: 6 });\r\n\r\n // Build header: [u32 checksum][u16 length]\r\n const length = binaryData.length;\r\n const lengthBytes = new Uint8Array(2);\r\n lengthBytes[0] = length & 0xff;\r\n lengthBytes[1] = (length >> 8) & 0xff;\r\n\r\n // Calculate CRC32 of length + compressed data\r\n const checksumInput = new Uint8Array(2 + compressed.length);\r\n checksumInput.set(lengthBytes, 0);\r\n checksumInput.set(compressed, 2);\r\n const checksum = crc32(checksumInput);\r\n\r\n // Build full payload: header + compressed\r\n const fullData = new Uint8Array(6 + compressed.length);\r\n fullData[0] = checksum & 0xff;\r\n fullData[1] = (checksum >> 8) & 0xff;\r\n fullData[2] = (checksum >> 16) & 0xff;\r\n fullData[3] = (checksum >> 24) & 0xff;\r\n fullData[4] = lengthBytes[0];\r\n fullData[5] = lengthBytes[1];\r\n fullData.set(compressed, 6);\r\n\r\n // Convert to Base64\r\n let b64 = '';\r\n for (let i = 0; i < fullData.length; i++) {\r\n b64 += String.fromCharCode(fullData[i]);\r\n }\r\n b64 = btoa(b64);\r\n\r\n // Convert to URL-safe Base64 and remove padding\r\n b64 = b64.replace(/=+$/, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n\r\n // Use provided key or generate random\r\n if (key === undefined || key < 0 || key > 63) {\r\n key = Math.floor(Math.random() * 64);\r\n }\r\n\r\n // Get key character for output\r\n const keyCharStandard = base64ValueToChar(key);\r\n const keyCharCode = keyCharStandard.charCodeAt(0);\r\n const keySource = KEY_REVERSE[keyCharCode] ?? 86; // Default to 'V'\r\n\r\n // Encode each character\r\n const encoded: string[] = [];\r\n\r\n for (let i = 0; i < b64.length; i++) {\r\n const c = b64[i];\r\n const val = charToBase64Value(c);\r\n const encodedVal = (val + i + key) & 63;\r\n const standardChar = base64ValueToChar(encodedVal);\r\n const standardCharCode = standardChar.charCodeAt(0);\r\n const substChar = FORWARD_MAPPING[standardCharCode] ?? 65; // Default to 'A'\r\n encoded.push(String.fromCharCode(substChar));\r\n }\r\n\r\n return `[stgy:a${String.fromCharCode(keySource)}${encoded.join('')}]`;\r\n}\r\n\r\n/**\r\n * CRC32 implementation (same as zlib.crc32).\r\n */\r\nfunction crc32(data: Uint8Array): number {\r\n let crc = 0xffffffff;\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n crc ^= data[i];\r\n for (let j = 0; j < 8; j++) {\r\n if (crc & 1) {\r\n crc = (crc >>> 1) ^ 0xedb88320;\r\n } else {\r\n crc = crc >>> 1;\r\n }\r\n }\r\n }\r\n\r\n return (crc ^ 0xffffffff) >>> 0;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board encoder (JSON → share code).\r\n */\r\n\r\nimport type { StrategyBoard, EncodeOptions } from './types';\r\nimport { sanitizeBoard } from './validation';\r\nimport { buildBinary } from './binary';\r\nimport { encodeCipher } from './cipher';\r\n\r\n/**\r\n * Encodes a strategy board to a share code.\r\n *\r\n * @param board - Strategy board to encode\r\n * @param options - Optional encoding options\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n * @throws {Error} If board data is invalid\r\n *\r\n * @example\r\n * ```ts\r\n * import { encode } from 'xiv-strat-board';\r\n *\r\n * const shareCode = encode({\r\n * name: 'myboard',\r\n * boardBackground: 'checkered',\r\n * objects: [\r\n * { type: 'tank', x: 256, y: 192, size: 100 },\r\n * { type: 'healer', x: 300, y: 192, size: 100 },\r\n * ],\r\n * });\r\n *\r\n * console.log(shareCode); // \"[stgy:a...]\"\r\n * ```\r\n */\r\nexport function encode(board: StrategyBoard, options?: EncodeOptions): string {\r\n // Validate and sanitize input\r\n const sanitized = sanitizeBoard(board);\r\n\r\n // Build binary format\r\n const binary = buildBinary(sanitized);\r\n\r\n // Encode with cipher\r\n return encodeCipher(binary, options?.key);\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board decoder (share code → JSON).\r\n */\r\n\r\nimport type { DecodeResult } from './types';\r\nimport { validateShareCode } from './validation';\r\nimport { decodeCipher } from './cipher';\r\nimport { parseBinary } from './binary';\r\n\r\n/**\r\n * Decodes a share code to a strategy board.\r\n *\r\n * @param shareCode - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decoded strategy board\r\n * @throws {Error} If share code is invalid or malformed\r\n *\r\n * @example\r\n * ```ts\r\n * import { decode } from 'xiv-strat-board';\r\n *\r\n * const board = decode('[stgy:aVe......]');\r\n *\r\n * console.log(board.name);\r\n * console.log(board.objects.length);\r\n * for (const obj of board.objects) {\r\n * console.log(`${obj.type} at (${obj.x}, ${obj.y})`);\r\n * }\r\n * ```\r\n */\r\nexport function decode(shareCode: string): DecodeResult {\r\n // Validate share code format\r\n validateShareCode(shareCode);\r\n\r\n // Decode cipher and decompress\r\n const binary = decodeCipher(shareCode);\r\n\r\n // Parse binary format\r\n return parseBinary(binary);\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/validation.ts","../src/binary.ts","../src/cipher.ts","../src/encoder.ts","../src/decoder.ts"],"names":[],"mappings":"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AAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC/D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAC9D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC7D,EAAA,EAAI,EAAA;AAAA,EAAI,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC5D,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAC7D,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAC9D,EAAA,EAAI,GAAA;AAAA,EAAK,GAAA,EAAK,GAAA;AAAA,EAAK,GAAA,EAAK;AAC5B,CAAA;AAMO,IAAM,kBAA0C,EAAC;AACxD,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAClD,EAAA,eAAA,CAAgB,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AACjC;AAMO,IAAM,aAAA,GAAwC;AAAA;AAAA,EAEjD,gBAAA,EAAkB,CAAA;AAAA,EAClB,gBAAA,EAAkB,CAAA;AAAA,EAClB,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA;AAAA,EAGb,UAAA,EAAY,CAAA;AAAA,EACZ,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,EAAA;AAAA,EACX,KAAA,EAAO,EAAA;AAAA,EACP,WAAA,EAAa,GAAA;AAAA,EACb,gBAAA,EAAkB,GAAA;AAAA,EAClB,UAAA,EAAY,GAAA;AAAA,EACZ,gBAAA,EAAkB,GAAA;AAAA,EAClB,gBAAA,EAAkB,GAAA;AAAA,EAClB,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,GAAA;AAAA,EACX,iBAAA,EAAmB,GAAA;AAAA,EACnB,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA;AAAA,EAGf,SAAA,EAAW,EAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,QAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAO,EAAA;AAAA;AAAA,EAGP,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM,EAAA;AAAA,EACN,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM,EAAA;AAAA,EACN,UAAA,EAAY,EAAA;AAAA,EACZ,UAAA,EAAY,EAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,EAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW,EAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,SAAA,EAAW,EAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,WAAA,EAAa,GAAA;AAAA;AAAA,EAGb,IAAA,EAAM,EAAA;AAAA,EACN,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,mBAAA,EAAqB,GAAA;AAAA,EACrB,kBAAA,EAAoB,GAAA;AAAA,EACpB,WAAA,EAAa,GAAA;AAAA,EACb,cAAA,EAAgB,GAAA;AAAA;AAAA,EAGhB,WAAA,EAAa,EAAA;AAAA,EACb,YAAA,EAAc,EAAA;AAAA,EACd,WAAA,EAAa,EAAA;AAAA;AAAA,EAGb,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA;AAAA,EAGV,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,EAAA;AAAA;AAAA,EAGjB,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA;AAAA,EAGX,YAAA,EAAc,EAAA;AAAA,EACd,OAAA,EAAS,EAAA;AAAA,EACT,cAAA,EAAgB,EAAA;AAAA,EAChB,YAAA,EAAc,EAAA;AAAA,EACd,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ,GAAA;AAAA,EACR,kBAAA,EAAoB,GAAA;AAAA,EACpB,aAAA,EAAe,GAAA;AAAA,EACf,kBAAA,EAAoB,GAAA;AAAA,EACpB,oBAAA,EAAsB,GAAA;AAAA,EACtB,gBAAA,EAAkB,GAAA;AAAA,EAClB,uBAAA,EAAyB,GAAA;AAAA;AAAA,EAGzB,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA;AAAA,EAGd,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA;AAAA,EAGd,KAAA,EAAO;AACX;AAKO,IAAM,aAAqC;AAClD,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACpD,EAAA,UAAA,CAAW,EAAE,CAAA,GAAI,IAAA;AACrB;AAMO,IAAM,sBAAA,GAAiD;AAAA,EAC1D,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,kBAAA;AAAA,EACH,CAAA,EAAG,kBAAA;AAAA,EACH,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG;AACP,CAAA;AAKO,IAAM,oBAAA,GAA+C;AAAA,EACxD,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,gBAAA,EAAkB,CAAA;AAAA,EAClB,gBAAA,EAAkB,CAAA;AAAA,EAClB,IAAA,EAAM,CAAA;AAAA,EACN,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa;AACjB,CAAA;AAKO,IAAM,uBAAA,GAAkD;AAAA,EAC3D,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,kBAAA;AAAA,EACH,CAAA,EAAG,kBAAA;AAAA,EACH,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG;AACP,CAAA;AAKO,IAAM,qBAAA,GAAgD;AAAA,EACzD,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,gBAAA,EAAkB,CAAA;AAAA,EAClB,gBAAA,EAAkB,CAAA;AAAA,EAClB,IAAA,EAAM,CAAA;AAAA,EACN,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa;AACjB,CAAA;;;ACjQO,IAAM,MAAA,GAAS;AAAA;AAAA,EAElB,IAAA,EAAM,IAAA;AAAA;AAAA,EAEN,IAAA,EAAM,GAAA;AAAA;AAAA,EAEN,IAAA,EAAM,IAAA;AAAA;AAAA,EAEN,IAAA,EAAM,GAAA;AAAA;AAAA,EAEN,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,OAAA,EAAS,GAAA;AAAA;AAAA,EAET,MAAA,EAAQ,CAAA;AAAA;AAAA,EAER,MAAA,EAAQ,GAAA;AAAA;AAAA,EAER,QAAA,EAAU,CAAA;AAAA;AAAA,EAEV,QAAA,EAAU,GAAA;AAAA;AAAA,EAEV,UAAA,EAAY,EAAA;AAAA;AAAA,EAEZ,aAAA,EAAe;AACnB,CAAA;AAKA,IAAM,qBAAqB,IAAI,GAAA;AAAA,EAC3B,mEAAA,CAAoE,MAAM,EAAE;AAChF,CAAA;AAQO,SAAS,kBAAkB,IAAA,EAAoB;AAClD,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AAClB,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAO;AACrB,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAClD;AAGA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAE7B,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAClD;AAGA,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACrB,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAAA,EACJ;AACJ;AAKA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC7C;AASO,SAAS,aAAa,IAAA,EAAkC;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,OAAO,OAAA;AAAA,EACX;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CACb,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,eAAA,EAAiB,EAAE,EAC3B,IAAA,EAAK,CACL,KAAA,CAAM,CAAA,EAAG,OAAO,aAAa,CAAA;AAElC,EAAA,OAAO,SAAA,IAAa,OAAA;AACxB;AASO,SAAS,kBAAA,CAAmB,OAAgB,GAAA,EAAsB;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACtD,IAAA,OAAO,MAAM,GAAA,GAAM,GAAA;AAAA,EACvB;AAEA,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA;AACvC,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA;AAEvC,EAAA,OAAO,KAAA,CAAM,KAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA,GAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AACtD;AAQO,SAAS,aAAa,KAAA,EAAwB;AACjD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACtD,IAAA,OAAO,GAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAA,CAAM,KAAK,GAAG,MAAA,CAAO,OAAA,EAAS,OAAO,OAAO,CAAA;AAClE;AAKO,SAAS,uBAAuB,KAAA,EAAwB;AAC3D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACtD,IAAA,OAAO,GAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,GAAG,CAAA;AAC1C;AAQO,SAAS,cAAc,KAAA,EAAuE;AACjG,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAGlC,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/B,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO;AAAA,IACH,GAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IAC/B,GAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IAC/B,GAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE;AAAA,GACnC;AACJ;AAKO,SAAS,mBAAmB,KAAA,EAAwB;AACvD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG;AAC1B,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,OAAO,CAAA;AAAA,EACX;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,KAAA,CAAM,WAAA,EAAa,CAAA;AACpD,IAAA,OAAO,EAAA,IAAM,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,CAAA;AACX;AAKO,SAAS,wBAAwB,KAAA,EAAwB;AAC5D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,EAAA,GAAK,oBAAA,CAAqB,KAAA,CAAM,WAAA,EAAa,CAAA;AACnD,IAAA,OAAO,EAAA,IAAM,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,IAAK,SAAS,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAA;AACX;AAUO,SAAS,gBAAA,CAAiB,UAAkB,MAAA,EAAyB;AAExE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,GAAA,EAAK;AACrF,IAAA,OAAO,MAAA;AAAA,EACX;AAGA,EAAA,MAAM,EAAA,GAAK,cAAc,QAAQ,CAAA;AACjC,EAAA,IAAI,OAAO,MAAA,EAAW;AAClB,IAAA,OAAO,EAAA;AAAA,EACX;AAGA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,KAAA,CAAM,iBAAiB,CAAA;AACrD,EAAA,IAAI,YAAA,EAAc;AACd,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,YAAA,CAAa,CAAC,GAAG,EAAE,CAAA;AAC7C,IAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,GAAA,EAAK;AAChC,MAAA,OAAO,QAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,CAAG,CAAA;AACtD;AAUO,SAAS,cAAA,CACZ,KACA,KAAA,EAeF;AACE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,sBAAA,CAAwB,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,IAAI,MAAA,EAAQ;AAC1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,SAAS,gBAAA,CAAiB,GAAA,CAAI,IAAA,IAAQ,EAAA,EAAI,IAAI,MAAM,CAAA;AAG1D,EAAA,IAAI,MAAA,GAAS,IAAI,MAAA,IAAU,GAAA;AAC3B,EAAA,IAAI,MAAA,GAAS,IAAI,MAAA,IAAU,GAAA;AAC3B,EAAA,IAAI,MAAA,GAAS,IAAI,MAAA,IAAU,GAAA;AAE3B,EAAA,IAAI,IAAI,KAAA,EAAO;AACX,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAA,GAAS,MAAA,CAAO,CAAA;AAChB,MAAA,MAAA,GAAS,MAAA,CAAO,CAAA;AAChB,MAAA,MAAA,GAAS,MAAA,CAAO,CAAA;AAAA,IACpB;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,CAAA,EAAG,kBAAA,CAAmB,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACjC,CAAA,EAAG,kBAAA,CAAmB,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,IAClC,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,IAC3B,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,IAC7C,MAAA,EAAQ,uBAAuB,MAAM,CAAA;AAAA,IACrC,MAAA,EAAQ,uBAAuB,MAAM,CAAA;AAAA,IACrC,MAAA,EAAQ,uBAAuB,MAAM,CAAA;AAAA,IACrC,YAAA,EAAc,sBAAA,CAAuB,GAAA,CAAI,YAAA,IAAgB,CAAC,CAAA;AAAA,IAC1D,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA,EAAG,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA;AAAA,IAC3E,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAA,IAAe,CAAC,CAAA,EAAG,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IACrF,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAAA,IAC1B,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM;AAAA,GAC9B;AACJ;AASO,SAAS,cAAc,KAAA,EAI5B;AACE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,UAAA,EAAY;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,MAAA,CAAO,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,IAC7B,eAAA,EAAiB,uBAAA,CAAwB,KAAA,CAAM,eAAe,CAAA;AAAA,IAC9D,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM,cAAA,CAAe,GAAA,EAAK,CAAC,CAAC;AAAA,GACjE;AACJ;;;AC1UA,IAAM,eAAN,MAAmB;AAAA,EACP,IAAA;AAAA,EACA,GAAA;AAAA,EAER,YAAY,IAAA,EAAkB;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,UAAU,CAAA;AACtE,IAAA,IAAA,CAAK,GAAA,GAAM,CAAA;AAAA,EACf;AAAA,EAEA,IAAI,QAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,IAAA,CAAK,UAAA;AAAA,EACrB;AAAA,EAEA,IAAI,SAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA;AAAA,EAC9B;AAAA,EAEA,KAAK,GAAA,EAAmB;AACpB,IAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,mBAAA,EAAsB,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACf;AAAA,EAEA,SAAA,GAAoB;AAChB,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,SAAA,GAAoB;AAChB,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,UAAA,GAAqB;AACjB,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,UAAA,GAAqB;AACjB,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,GAAA,IAAO,CAAA;AACZ,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,UAAU,KAAA,EAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AACpF,IAAA,IAAA,CAAK,GAAA,IAAO,KAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAA;AASO,SAAS,YAAY,IAAA,EAAgC;AACxD,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAM;AACpB,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,IAAI,CAAA;AAGpC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAGlC,EAAA,MAAA,CAAO,KAAK,EAAI,CAAA;AAChB,EAAA,MAAA,CAAO,UAAA,EAAW;AAGlB,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,EAAW;AAErC,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,GAAO,UAAA,EAAY;AACjC,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC7D;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,CAAA,CACjD,MAAA,CAAO,SAAS,CAAA,CAChB,OAAA,CAAQ,MAAA,EAAQ,EAAE,EAClB,IAAA,EAAK;AAIV,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,OAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,IAAA,IAAI,WAAW,CAAA,EAAG;AAEd,MAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,WAAW,CAAA,EAAG;AAErB,MAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAC9B,MAAA,IAAI,MAAM,CAAA,EAAG;AAET,QAAA,IAAI,MAAA,CAAO,YAAY,GAAA,EAAK;AAC5B,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA;AACtC,QAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CACxD,MAAA,CAAO,SAAS,CAAA,CAChB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvB,QAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,MACjC,CAAA,MAAO;AAEH,QAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA;AAC/B,QAAA;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA;AAC/B,MAAA;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAGhB,EAAA,MAAM,YAA6C,EAAC;AACpD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAgE,EAAC;AACvE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,eAAA,GAAkB,CAAA;AAGtB,EAAA,OAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AAC1B,IAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAE9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AAEX,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAElB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,QAAA,GAAW,OAAO,UAAA,EAAW;AAEnC,MAAA,IAAI,WAAW,CAAA,EAAG;AAEd,QAAA,IAAI,MAAA,CAAO,SAAA,GAAY,QAAA,GAAW,CAAA,EAAG;AACrC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,UAAA,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,QACxC;AAAA,MACJ,CAAA,MAAO;AAEH,QAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,QAAA,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,MACxC;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAElB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,SAAA,EAAU,GAAI,EAAA;AAC/B,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,SAAA,EAAU,GAAI,EAAA;AAC/B,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,MAC3B;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAElB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AAErD,QAAA,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAA;AAAA,MACvC;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAElB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAA;AAAA,MACjC;AAGA,MAAA,IAAI,KAAA,GAAQ,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,aAAa,CAAA,EAAG;AAC1C,QAAA,MAAA,CAAO,SAAA,EAAU;AAAA,MACrB;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAElB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,MAAM,CAAA,GAAI,OAAO,SAAA,EAAU;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAO,SAAA,EAAU;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAO,SAAA,EAAU;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAO,SAAA,EAAU;AAC3B,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,MAC9B;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,EAAA,EAAI;AAEnB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,MAClC;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,EAAA,EAAI;AAEnB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,MAClC;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,EAAA,EAAI;AAEnB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,UAAA,EAAW;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAEhC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,CAAA,EAAA,EAAK;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,MAClC;AAAA,IACJ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AAIlB,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAE9B,MAAA,IAAI,QAAQ,CAAA,EAAG;AAEX,QAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO,UAAA,EAAW;AAClB,QAAA,eAAA,GAAkB,OAAO,UAAA,EAAW;AACpC,QAAA;AAAA,MACJ,CAAA,MAAO;AAGH,QAAA,IAAI,MAAA,CAAO,YAAY,GAAA,EAAK;AAC5B,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA;AACtC,QAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CACxD,MAAA,CAAO,SAAS,CAAA,CAChB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvB,QAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,MAEjC;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA;AAAA,IACJ;AAAA,EACJ;AAGA,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAM,CAAA,IAAK,WAAW,MAAM,CAAA,CAAA;AAExD,IAAA,MAAM,GAAA,GAAkC;AAAA,MACpC,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA,IAAK,CAAA;AAAA,MACtB,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA,IAAK;AAAA,KAC1B;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAKjD,IAAA,MAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AACpE,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AAE5B,MAAA,IAAI,YAAY,CAAC,CAAA,KAAM,UAAa,WAAA,CAAY,CAAC,MAAM,CAAA,EAAG;AACtD,QAAA,GAAA,CAAI,KAAA,GAAQ,YAAY,CAAC,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAA,MAAA,IAAW,YAAY,CAAC,CAAA,KAAM,UAAa,WAAA,CAAY,CAAC,IAAI,CAAA,EAAG;AAE3D,MAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,WAAA,CAAY,CAAC,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,UAAA,GAAa,MAAA,IAA4B,WAAA,CAAY,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,EAAG;AACX,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,GAAI,OAAO,CAAC,CAAA;AAE/B,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACnH,QAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AAAA,MAChB;AAEA,MAAA,IAAI,IAAI,CAAA,EAAG;AACP,QAAA,GAAA,CAAI,YAAA,GAAe,CAAA;AAAA,MACvB;AAAA,IACJ;AAGA,IAAA,IAAI,WAAW,EAAA,EAAI;AAEf,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,KAAA,GAAQ,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,MACxB;AAAA,IACJ,CAAA,MAAA,IAAW,WAAW,EAAA,EAAI;AAEtB,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,QAAA,GAAW,MAAM,CAAC,CAAA;AAAA,MAC1B;AAAA,IACJ,CAAA,MAAA,IAAW,WAAW,EAAA,EAAI;AAEtB,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAAA,MAC1B;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAAA,MAC1B;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,MACxB;AAAA,IACJ,CAAA,MAAA,IAAW,WAAW,EAAA,EAAI;AAEtB,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,YAAA,GAAe,MAAM,CAAC,CAAA;AAAA,MAC9B;AAAA,IACJ,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AAEvB,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,eAAA,GAAkB,MAAM,CAAC,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,aAAA,GAAgB,MAAM,CAAC,CAAA;AAAA,MAC/B;AAAA,IACJ,CAAA,MAAA,IAAW,WAAW,EAAA,EAAI;AAEtB,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,QAAA,GAAW,MAAM,CAAC,CAAA;AAAA,MAC1B;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,WAAA,GAAc,MAAM,CAAC,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,QAAA,GAAW,MAAM,CAAC,CAAA;AAAA,MAC1B;AACA,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,WAAA,GAAc,MAAM,CAAC,CAAA;AAAA,MAC7B;AAAA,IACJ;AAGA,IAAA,IAAI,MAAA,KAAW,GAAA,IAAO,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,IAAA,GAAO,aAAa,KAAA,EAAM;AAAA,IAClC;AAOA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AACnC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAU,CAAA,EAAG;AACzB,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AAAA,IACjB;AACA,IAAA,IAAI,WAAW,CAAA,EAAM;AACjB,MAAA,GAAA,CAAI,cAAA,GAAiB,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,WAAW,CAAA,EAAM;AACjB,MAAA,GAAA,CAAI,YAAA,GAAe,IAAA;AAAA,IACvB;AACA,IAAA,IAAI,WAAW,CAAA,EAAM;AACjB,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AAAA,IACjB;AAEA,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO;AAAA,IACH,OAAA;AAAA,IACA,MAAM,IAAA,IAAQ,MAAA;AAAA,IACd,eAAA,EAAiB,sBAAA,CAAuB,eAAe,CAAA,IAAuB,MAAA;AAAA,IAC9E;AAAA,GACJ;AACJ;AAQO,SAAS,YAAY,IAAA,EAIb;AACX,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAQ,GAAI,IAAA;AAC3C,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAclB,EAAA,MAAM,QAAA,GAAW,CAAA,IAAK,CAAA,GAAI,CAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACvC,EAAA,MAAM,WAAW,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,KAAM,IAAI,CAAA,GAAI,CAAA,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,CAAA,KAAM,CAAA,GACnB,EAAA,GAAO,CAAA,GACP,EAAA,GAAO,CAAA,GAAI,CAAA,GAAI,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAK,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAK,CAAA;AAE/H,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,UAAU,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAM,CAAA;AAChC,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACtB,IAAA,GAAA,IAAO,CAAA;AAAA,EACX,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAC7B,IAAA,GAAA,IAAO,CAAA;AAAA,EACX,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAC5B,IAAA,GAAA,IAAO,CAAA;AAAA,EACX,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAC7B,IAAA,GAAA,IAAO,CAAA;AAAA,EACX,CAAA;AAGA,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,aAAgB,CAAC,CAAA;AACzC,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AAGb,EAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,IAAA,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,EAChC;AAGA,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,IAAI,MAAM,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,MAAM,CAAA,EAAG,CAEb,MAAA,IAAW,MAAM,CAAA,EAAG;AAEhB,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,IAAI,MAAA,EAAQ;AACZ,MAAA,QAAA,GAAW,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACnB,MAAA,QAAA,GAAW,CAAA;AAAA,IACf;AACA,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,EACxB,CAAA,MAAO;AAEH,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACjB;AAAA,EACJ;AAGA,EAAA,IAAI,IAAI,CAAA,EAAG;AAEP,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,EAAE,CAAC,CAAA;AACjC,MAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,IACrC;AAGA,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,WAAA,CAAY,IAAI,UAAU,CAAA;AAAA,IAC9B;AAGA,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,GAAA,CAAI,OAAO,GAAI,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACb,MAAA,UAAA,CAAW,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,IAAI,MAAM,CAAA;AACrB,MAAA,UAAA,CAAW,IAAI,MAAM,CAAA;AACrB,MAAA,UAAA,CAAW,IAAI,MAAM,CAAA;AACrB,MAAA,UAAA,CAAW,IAAI,YAAY,CAAA;AAAA,IAC/B;AAGA,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AAAA,IAC5B;AAGA,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,WAAA,CAAY,IAAI,WAAW,CAAA;AAAA,IAC/B;AAGA,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACjB;AAAA,EACJ;AAGA,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,CAAC,CAAA;AACb,EAAA,WAAA,CAAY,eAAe,CAAA;AAG3B,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,MAAA,EAAQ,GAAG,GAAG,CAAA;AAG5C,EAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,UAAU,CAAA;AACnF,EAAA,MAAM,cAAc,GAAA,GAAM,EAAA;AAC1B,EAAA,UAAA,CAAW,SAAA,CAAU,EAAA,EAAM,WAAA,EAAa,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAU,GAAA,GAAM,EAAA;AACtB,EAAA,UAAA,CAAW,SAAA,CAAU,CAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAExC,EAAA,OAAO,MAAA;AACX;AC9lBO,SAAS,kBAAkB,CAAA,EAAmB;AACjD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA;AAGxB,EAAA,IAAI,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,SAAW,CAAA,GAAI,EAAA;AAEnC,EAAA,IAAI,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,GAAA,SAAY,CAAA,GAAI,EAAA;AAEpC,EAAA,IAAI,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,SAAW,CAAA,GAAI,CAAA;AAEnC,EAAA,IAAI,CAAA,KAAM,KAAK,OAAO,EAAA;AACtB,EAAA,IAAI,CAAA,KAAM,KAAK,OAAO,EAAA;AAEtB,EAAA,OAAO,CAAA;AACX;AAQO,SAAS,kBAAkB,GAAA,EAAqB;AACnD,EAAA,GAAA,GAAM,GAAA,GAAM,EAAA;AAEZ,EAAA,IAAI,MAAM,EAAA,EAAI,OAAO,MAAA,CAAO,YAAA,CAAa,MAAM,EAAE,CAAA;AACjD,EAAA,IAAI,MAAM,EAAA,EAAI,OAAO,MAAA,CAAO,YAAA,CAAa,MAAM,EAAE,CAAA;AACjD,EAAA,IAAI,MAAM,EAAA,EAAI,OAAO,MAAA,CAAO,YAAA,CAAa,MAAM,CAAC,CAAA;AAChD,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,GAAA;AACvB,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,GAAA;AAEvB,EAAA,OAAO,GAAA;AACX;AASO,SAAS,aAAa,UAAA,EAAgC;AAEzD,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEnC,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAClD;AAGA,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA;AAExC,EAAA,IAAI,WAAA,IAAe,aAAa,MAAA,EAAQ;AACpC,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,SAAA,GAAY,aAAa,WAAW,CAAA;AAC1C,EAAA,IAAI,cAAc,CAAA,EAAG;AACjB,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,kBAAkB,aAAa,CAAA;AAG3C,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACpB,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA;AAG/B,IAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,QAAQ,CAAA,IAAK,EAAA;AACtD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,gBAAgB,CAAA;AAGzD,IAAA,MAAM,GAAA,GAAM,kBAAkB,YAAY,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAc,GAAA,GAAM,CAAA,GAAI,GAAA,GAAO,EAAA;AAErC,IAAA,OAAA,CAAQ,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAC,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAGrE,EAAA,MAAM,SAAA,GAAA,CAAa,CAAA,GAAK,SAAA,CAAU,MAAA,GAAS,CAAA,IAAM,CAAA;AACjD,EAAA,SAAA,IAAa,GAAA,CAAI,OAAO,SAAS,CAAA;AAGjC,EAAA,MAAM,YAAA,GAAe,KAAK,SAAS,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACrD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI;AACA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA,EAClC,SAAS,CAAA,EAAG;AACR,IAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,EACpG;AACJ;AASO,SAAS,YAAA,CAAa,YAAwB,GAAA,EAAsB;AAEvE,EAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAGxD,EAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,EAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,CAAC,CAAA;AACpC,EAAA,WAAA,CAAY,CAAC,IAAI,MAAA,GAAS,GAAA;AAC1B,EAAA,WAAA,CAAY,CAAC,CAAA,GAAK,MAAA,IAAU,CAAA,GAAK,GAAA;AAGjC,EAAA,MAAM,aAAA,GAAgB,IAAI,UAAA,CAAW,CAAA,GAAI,WAAW,MAAM,CAAA;AAC1D,EAAA,aAAA,CAAc,GAAA,CAAI,aAAa,CAAC,CAAA;AAChC,EAAA,aAAA,CAAc,GAAA,CAAI,YAAY,CAAC,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,MAAM,aAAa,CAAA;AAGpC,EAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,CAAA,GAAI,WAAW,MAAM,CAAA;AACrD,EAAA,QAAA,CAAS,CAAC,IAAI,QAAA,GAAW,GAAA;AACzB,EAAA,QAAA,CAAS,CAAC,CAAA,GAAK,QAAA,IAAY,CAAA,GAAK,GAAA;AAChC,EAAA,QAAA,CAAS,CAAC,CAAA,GAAK,QAAA,IAAY,EAAA,GAAM,GAAA;AACjC,EAAA,QAAA,CAAS,CAAC,CAAA,GAAK,QAAA,IAAY,EAAA,GAAM,GAAA;AACjC,EAAA,QAAA,CAAS,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAC3B,EAAA,QAAA,CAAS,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAC3B,EAAA,QAAA,CAAS,GAAA,CAAI,YAAY,CAAC,CAAA;AAG1B,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,IAAO,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,GAAA,GAAM,KAAK,GAAG,CAAA;AAGd,EAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAGnE,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,GAAM,CAAA,IAAK,MAAM,EAAA,EAAI;AAC1C,IAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,EAAE,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,eAAA,GAAkB,kBAAkB,GAAG,CAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,UAAA,CAAW,CAAC,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,WAAW,CAAA,IAAK,EAAA;AAG9C,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,MAAM,GAAA,GAAM,kBAAkB,CAAC,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAc,GAAA,GAAM,CAAA,GAAI,GAAA,GAAO,EAAA;AACrC,IAAA,MAAM,YAAA,GAAe,kBAAkB,UAAU,CAAA;AACjD,IAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,gBAAgB,CAAA,IAAK,EAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,CAAA,OAAA,EAAU,OAAO,YAAA,CAAa,SAAS,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,CAAA;AACtE;AAKA,SAAS,MAAM,IAAA,EAA0B;AACrC,EAAA,IAAI,GAAA,GAAM,UAAA;AAEV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,GAAA,IAAO,KAAK,CAAC,CAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,GAAA,GAAO,QAAQ,CAAA,GAAK,UAAA;AAAA,MACxB,CAAA,MAAO;AACH,QAAA,GAAA,GAAM,GAAA,KAAQ,CAAA;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAA,CAAQ,MAAM,UAAA,MAAgB,CAAA;AAClC;;;ACtLO,SAAS,MAAA,CAAO,OAAsB,OAAA,EAAiC;AAE1E,EAAA,MAAM,SAAA,GAAY,cAAc,KAAK,CAAA;AAGrC,EAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AAGpC,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,GAAG,CAAA;AAC5C;;;ACbO,SAAS,OAAO,SAAA,EAAiC;AAEpD,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAG3B,EAAA,MAAM,MAAA,GAAS,aAAa,SAAS,CAAA;AAGrC,EAAA,OAAO,YAAY,MAAM,CAAA;AAC7B","file":"index.js","sourcesContent":["/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher tables and icon/background mappings from game data.\r\n */\r\n\r\n/**\r\n * Cipher lookup table (DAT_1420cf520 from game binary).\r\n * Used to decode the key character in share codes.\r\n */\r\nexport const CIPHER_TABLE = new Uint8Array([\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 80, 0, 0,\r\n 120, 103, 48, 75, 56, 83, 74, 50, 115, 90, 0, 0, 0, 0, 0, 0,\r\n 0, 68, 70, 116, 84, 54, 69, 97, 86, 99, 112, 76, 77, 109, 101, 106,\r\n 57, 88, 66, 52, 82, 89, 55, 95, 110, 79, 98, 0, 0, 0, 0, 0,\r\n 0, 105, 45, 118, 72, 67, 65, 114, 87, 111, 100, 73, 113, 104, 85, 108,\r\n 107, 51, 102, 121, 53, 71, 119, 49, 117, 122, 81, 0, 0, 0, 0, 0,\r\n]);\r\n\r\n/**\r\n * Reverse mapping of CIPHER_TABLE for encoding.\r\n * Maps output character code -> input character code.\r\n */\r\nexport const KEY_REVERSE: Record<number, number> = {};\r\nfor (let i = 0; i < CIPHER_TABLE.length; i++) {\r\n if (CIPHER_TABLE[i] !== 0) {\r\n KEY_REVERSE[CIPHER_TABLE[i]] = i;\r\n }\r\n}\r\n\r\n/**\r\n * Inverse character substitution mapping.\r\n * Maps obfuscated character code -> standard Base64 character code.\r\n */\r\nexport const INVERSE_MAPPING: Record<number, number> = {\r\n 98: 45, 50: 48, 119: 49, 55: 50, 113: 51, 83: 52, 116: 53, 69: 54,\r\n 86: 55, 52: 56, 80: 57, 102: 65, 82: 66, 101: 67, 65: 68, 70: 69,\r\n 66: 70, 117: 71, 100: 72, 107: 73, 54: 74, 51: 75, 75: 76, 76: 77,\r\n 43: 78, 89: 79, 45: 80, 122: 81, 84: 82, 53: 83, 68: 84, 110: 85,\r\n 72: 86, 104: 87, 81: 88, 85: 89, 57: 90, 87: 95, 71: 97, 90: 98,\r\n 73: 99, 106: 100, 78: 101, 114: 102, 49: 103, 109: 104, 97: 105,\r\n 79: 106, 112: 107, 111: 108, 77: 109, 88: 110, 105: 111, 74: 112,\r\n 108: 113, 103: 114, 56: 115, 67: 116, 120: 117, 99: 118, 118: 119,\r\n 48: 120, 115: 121, 121: 122,\r\n};\r\n\r\n/**\r\n * Forward character substitution mapping (reverse of INVERSE_MAPPING).\r\n * Maps standard Base64 character code -> obfuscated character code.\r\n */\r\nexport const FORWARD_MAPPING: Record<number, number> = {};\r\nfor (const [k, v] of Object.entries(INVERSE_MAPPING)) {\r\n FORWARD_MAPPING[v] = Number(k);\r\n}\r\n\r\n/**\r\n * Icon type name to numeric ID mapping.\r\n * Complete list from stgy.csv game data.\r\n */\r\nexport const ICON_TYPE_IDS: Record<string, number> = {\r\n // Field backgrounds (type 1)\r\n checkered_circle: 4,\r\n checkered_square: 8,\r\n grey_circle: 124,\r\n grey_square: 125,\r\n\r\n // AoE/Mechanics (type 6)\r\n circle_aoe: 9,\r\n fan_aoe: 10,\r\n line_aoe: 11,\r\n line: 12,\r\n gaze: 13,\r\n stack: 14,\r\n line_stack: 15,\r\n proximity: 16,\r\n donut: 17,\r\n stack_multi: 106,\r\n proximity_player: 107,\r\n tankbuster: 108,\r\n radial_knockback: 109,\r\n linear_knockback: 110,\r\n tower: 111,\r\n targeting: 112,\r\n moving_circle_aoe: 126,\r\n '1person_aoe': 127,\r\n '2person_aoe': 128,\r\n '3person_aoe': 129,\r\n '4person_aoe': 130,\r\n\r\n // Base classes (type 2)\r\n gladiator: 18,\r\n pugilist: 19,\r\n marauder: 20,\r\n lancer: 21,\r\n archer: 22,\r\n conjurer: 23,\r\n thaumaturge: 24,\r\n arcanist: 25,\r\n rogue: 26,\r\n\r\n // Jobs (type 2)\r\n paladin: 27,\r\n monk: 28,\r\n warrior: 29,\r\n dragoon: 30,\r\n bard: 31,\r\n white_mage: 32,\r\n black_mage: 33,\r\n summoner: 34,\r\n scholar: 35,\r\n ninja: 36,\r\n machinist: 37,\r\n dark_knight: 38,\r\n astrologian: 39,\r\n samurai: 40,\r\n red_mage: 41,\r\n blue_mage: 42,\r\n gunbreaker: 43,\r\n dancer: 44,\r\n reaper: 45,\r\n sage: 46,\r\n viper: 101,\r\n pictomancer: 102,\r\n\r\n // Role markers (type 2)\r\n tank: 47,\r\n tank_1: 48,\r\n tank_2: 49,\r\n healer: 50,\r\n healer_1: 51,\r\n healer_2: 52,\r\n dps: 53,\r\n dps_1: 54,\r\n dps_2: 55,\r\n dps_3: 56,\r\n dps_4: 57,\r\n melee_dps: 118,\r\n ranged_dps: 119,\r\n physical_ranged_dps: 120,\r\n magical_ranged_dps: 121,\r\n pure_healer: 122,\r\n barrier_healer: 123,\r\n\r\n // Enemies (type 3)\r\n small_enemy: 60,\r\n medium_enemy: 62,\r\n large_enemy: 64,\r\n\r\n // Target markers (type 3)\r\n attack_1: 65,\r\n attack_2: 66,\r\n attack_3: 67,\r\n attack_4: 68,\r\n attack_5: 69,\r\n attack_6: 115,\r\n attack_7: 116,\r\n attack_8: 117,\r\n bind_1: 70,\r\n bind_2: 71,\r\n bind_3: 72,\r\n ignore_1: 73,\r\n ignore_2: 74,\r\n\r\n // Chain markers (type 3)\r\n square_marker: 75,\r\n circle_marker: 76,\r\n plus_marker: 77,\r\n triangle_marker: 78,\r\n\r\n // Waymarks (type 3)\r\n waymark_a: 79,\r\n waymark_b: 80,\r\n waymark_c: 81,\r\n waymark_d: 82,\r\n waymark_1: 83,\r\n waymark_2: 84,\r\n waymark_3: 85,\r\n waymark_4: 86,\r\n\r\n // Shapes (type 4)\r\n shape_circle: 87,\r\n shape_x: 88,\r\n shape_triangle: 89,\r\n shape_square: 90,\r\n up_arrow: 94,\r\n text: 100,\r\n rotate: 103,\r\n highlighted_circle: 135,\r\n highlighted_x: 136,\r\n highlighted_square: 137,\r\n highlighted_triangle: 138,\r\n rotate_clockwise: 139,\r\n rotate_counterclockwise: 140,\r\n\r\n // Effects (type 3)\r\n enhancement: 113,\r\n enfeeblement: 114,\r\n\r\n // Lock-on markers (type 3)\r\n lockon_red: 131,\r\n lockon_blue: 132,\r\n lockon_purple: 133,\r\n lockon_green: 134,\r\n\r\n // Groups (type 5)\r\n group: 105,\r\n};\r\n\r\n/**\r\n * Icon numeric ID to type name mapping (reverse of ICON_TYPE_IDS).\r\n */\r\nexport const ICON_TYPES: Record<number, string> = {};\r\nfor (const [name, id] of Object.entries(ICON_TYPE_IDS)) {\r\n ICON_TYPES[id] = name;\r\n}\r\n\r\n/**\r\n * Board background numeric ID to name mapping.\r\n * Used in Tag 3 footer.\r\n */\r\nexport const BOARD_BACKGROUND_TYPES: Record<number, string> = {\r\n 1: 'none',\r\n 2: 'checkered',\r\n 3: 'checkered_circle',\r\n 4: 'checkered_square',\r\n 5: 'grey',\r\n 6: 'grey_circle',\r\n 7: 'grey_square',\r\n};\r\n\r\n/**\r\n * Board background name to numeric ID mapping.\r\n */\r\nexport const BOARD_BACKGROUND_IDS: Record<string, number> = {\r\n none: 1,\r\n checkered: 2,\r\n checkered_circle: 3,\r\n checkered_square: 4,\r\n grey: 5,\r\n grey_circle: 6,\r\n grey_square: 7,\r\n};\r\n\r\n/**\r\n * Object background numeric ID to name mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_TYPES: Record<number, string> = {\r\n 0: 'none',\r\n 1: 'checkered',\r\n 2: 'checkered_circle',\r\n 3: 'checkered_square',\r\n 4: 'grey',\r\n 5: 'grey_circle',\r\n 6: 'grey_square',\r\n};\r\n\r\n/**\r\n * Object background name to numeric ID mapping.\r\n */\r\nexport const OBJECT_BACKGROUND_IDS: Record<string, number> = {\r\n none: 0,\r\n checkered: 1,\r\n checkered_circle: 2,\r\n checkered_square: 3,\r\n grey: 4,\r\n grey_circle: 5,\r\n grey_square: 6,\r\n};\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Input validation and sanitization for secure public package usage.\r\n */\r\n\r\nimport type { StrategyBoard, StrategyObject } from './types';\r\nimport { ICON_TYPE_IDS, BOARD_BACKGROUND_IDS, OBJECT_BACKGROUND_IDS } from './constants';\r\n\r\n/**\r\n * Board coordinate and property bounds.\r\n */\r\nexport const BOUNDS = {\r\n /** Minimum X coordinate (allows slight overflow for edge objects) */\r\n minX: -100,\r\n /** Maximum X coordinate */\r\n maxX: 612,\r\n /** Minimum Y coordinate */\r\n minY: -100,\r\n /** Maximum Y coordinate */\r\n maxY: 484,\r\n /** Minimum size percentage */\r\n minSize: 1,\r\n /** Maximum size percentage */\r\n maxSize: 255,\r\n /** Minimum arc angle */\r\n minArc: 0,\r\n /** Maximum arc angle */\r\n maxArc: 360,\r\n /** Minimum donut radius */\r\n minDonut: 0,\r\n /** Maximum donut radius */\r\n maxDonut: 255,\r\n /** Maximum number of objects per board */\r\n maxObjects: 50,\r\n /** Maximum name length (bytes) */\r\n maxNameLength: 7,\r\n} as const;\r\n\r\n/**\r\n * Characters allowed in cipher-encoded body.\r\n */\r\nconst VALID_CIPHER_CHARS = new Set(\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-_'.split('')\r\n);\r\n\r\n/**\r\n * Validates the format of a share code string.\r\n *\r\n * @param code - The share code to validate\r\n * @throws {Error} If the share code format is invalid\r\n */\r\nexport function validateShareCode(code: string): void {\r\n if (typeof code !== 'string') {\r\n throw new Error('Share code must be a string');\r\n }\r\n\r\n if (code.length < 10) {\r\n throw new Error('Share code is too short');\r\n }\r\n\r\n if (code.length > 10000) {\r\n throw new Error('Share code is too long');\r\n }\r\n\r\n if (!code.startsWith('[stgy:a')) {\r\n throw new Error('Share code must start with \"[stgy:a\"');\r\n }\r\n\r\n if (!code.endsWith(']')) {\r\n throw new Error('Share code must end with \"]\"');\r\n }\r\n\r\n // Extract body (between [stgy:a and ])\r\n const body = code.slice(7, -1);\r\n\r\n if (body.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // Validate all characters in body\r\n for (const char of body) {\r\n if (!VALID_CIPHER_CHARS.has(char)) {\r\n throw new Error(`Invalid character in share code: \"${char}\"`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Clamps a number to a range.\r\n */\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a board name.\r\n * Only allows ASCII alphanumeric characters, truncates to max length.\r\n *\r\n * @param name - The name to sanitize\r\n * @returns Sanitized name\r\n */\r\nexport function sanitizeName(name: string | undefined): string {\r\n if (!name || typeof name !== 'string') {\r\n return 'board';\r\n }\r\n\r\n // Remove non-ASCII and control characters, keep alphanumeric and some safe chars\r\n const sanitized = name\r\n .replace(/[^\\x20-\\x7E]/g, '') // Only printable ASCII\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove filesystem-unsafe chars\r\n .trim()\r\n .slice(0, BOUNDS.maxNameLength);\r\n\r\n return sanitized || 'board';\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a coordinate value.\r\n *\r\n * @param value - The coordinate value\r\n * @param isX - Whether this is an X coordinate\r\n * @returns Sanitized coordinate\r\n */\r\nexport function sanitizeCoordinate(value: unknown, isX: boolean): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return isX ? 256 : 192; // Default to center\r\n }\r\n\r\n const min = isX ? BOUNDS.minX : BOUNDS.minY;\r\n const max = isX ? BOUNDS.maxX : BOUNDS.maxY;\r\n\r\n return clamp(Math.round(value * 10) / 10, min, max);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a size value.\r\n *\r\n * @param value - The size value\r\n * @returns Sanitized size (50-200 range, default 100)\r\n */\r\nexport function sanitizeSize(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 100;\r\n }\r\n return clamp(Math.round(value), BOUNDS.minSize, BOUNDS.maxSize);\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a color component (0-255).\r\n */\r\nexport function sanitizeColorComponent(value: unknown): number {\r\n if (typeof value !== 'number' || !Number.isFinite(value)) {\r\n return 255;\r\n }\r\n return clamp(Math.round(value), 0, 255);\r\n}\r\n\r\n/**\r\n * Parses a hex color string to RGB components.\r\n *\r\n * @param color - Hex color string (e.g., '#FF0000' or 'FF0000')\r\n * @returns RGB components or null if invalid\r\n */\r\nexport function parseHexColor(color: string | undefined): { r: number; g: number; b: number } | null {\r\n if (!color || typeof color !== 'string') {\r\n return null;\r\n }\r\n\r\n // Remove # prefix if present\r\n const hex = color.replace(/^#/, '');\r\n\r\n // Validate hex format\r\n if (!/^[0-9A-Fa-f]{6}$/.test(hex)) {\r\n return null;\r\n }\r\n\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n };\r\n}\r\n\r\n/**\r\n * Validates a background type value.\r\n */\r\nexport function validateBackground(value: unknown): number {\r\n if (typeof value === 'number') {\r\n if (value >= 0 && value <= 6) {\r\n return value;\r\n }\r\n return 0;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const id = OBJECT_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 0;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Validates a board background type value.\r\n */\r\nexport function validateBoardBackground(value: unknown): number {\r\n if (typeof value === 'string') {\r\n const id = BOARD_BACKGROUND_IDS[value.toLowerCase()];\r\n return id ?? 1;\r\n }\r\n\r\n if (typeof value === 'number' && value >= 1 && value <= 7) {\r\n return value;\r\n }\r\n\r\n return 1; // default: none\r\n}\r\n\r\n/**\r\n * Validates an icon type, returning the numeric ID.\r\n *\r\n * @param typeName - Icon type name or ID\r\n * @param typeId - Optional explicit type ID\r\n * @returns Numeric icon type ID\r\n * @throws {Error} If icon type is unknown\r\n */\r\nexport function validateIconType(typeName: string, typeId?: number): number {\r\n // Explicit typeId takes priority\r\n if (typeof typeId === 'number' && Number.isFinite(typeId) && typeId > 0 && typeId < 256) {\r\n return typeId;\r\n }\r\n\r\n // Look up by name\r\n const id = ICON_TYPE_IDS[typeName];\r\n if (id !== undefined) {\r\n return id;\r\n }\r\n\r\n // Try to parse as unknown_{id} format\r\n const unknownMatch = typeName.match(/^unknown_(\\d+)$/);\r\n if (unknownMatch) {\r\n const parsedId = parseInt(unknownMatch[1], 10);\r\n if (parsedId > 0 && parsedId < 256) {\r\n return parsedId;\r\n }\r\n }\r\n\r\n throw new Error(`Unknown icon type: \"${typeName}\"`);\r\n}\r\n\r\n/**\r\n * Sanitizes a single strategy object.\r\n *\r\n * @param obj - The object to sanitize\r\n * @param index - Object index for error messages\r\n * @returns Sanitized object data\r\n * @throws {Error} If object data is invalid\r\n */\r\nexport function sanitizeObject(\r\n obj: StrategyObject,\r\n index: number\r\n): {\r\n typeId: number;\r\n x: number;\r\n y: number;\r\n size: number;\r\n background: number;\r\n colorR: number;\r\n colorG: number;\r\n colorB: number;\r\n transparency: number;\r\n arcAngle: number;\r\n donutRadius: number;\r\n hidden: boolean;\r\n locked: boolean;\r\n} {\r\n if (!obj || typeof obj !== 'object') {\r\n throw new Error(`Object at index ${index} is not a valid object`);\r\n }\r\n\r\n if (!obj.type && !obj.typeId) {\r\n throw new Error(`Object at index ${index} must have a type or typeId`);\r\n }\r\n\r\n const typeId = validateIconType(obj.type || '', obj.typeId);\r\n\r\n // Parse color from hex string or components\r\n let colorR = obj.colorR ?? 255;\r\n let colorG = obj.colorG ?? 255;\r\n let colorB = obj.colorB ?? 255;\r\n\r\n if (obj.color) {\r\n const parsed = parseHexColor(obj.color);\r\n if (parsed) {\r\n colorR = parsed.r;\r\n colorG = parsed.g;\r\n colorB = parsed.b;\r\n }\r\n }\r\n\r\n return {\r\n typeId,\r\n x: sanitizeCoordinate(obj.x, true),\r\n y: sanitizeCoordinate(obj.y, false),\r\n size: sanitizeSize(obj.size),\r\n background: validateBackground(obj.background),\r\n colorR: sanitizeColorComponent(colorR),\r\n colorG: sanitizeColorComponent(colorG),\r\n colorB: sanitizeColorComponent(colorB),\r\n transparency: sanitizeColorComponent(obj.transparency ?? 0),\r\n arcAngle: clamp(Math.round(obj.arcAngle ?? 0), BOUNDS.minArc, BOUNDS.maxArc),\r\n donutRadius: clamp(Math.round(obj.donutRadius ?? 0), BOUNDS.minDonut, BOUNDS.maxDonut),\r\n hidden: Boolean(obj.hidden),\r\n locked: Boolean(obj.locked),\r\n };\r\n}\r\n\r\n/**\r\n * Validates and sanitizes a complete strategy board for encoding.\r\n *\r\n * @param board - The board to sanitize\r\n * @returns Sanitized board data ready for binary encoding\r\n * @throws {Error} If board data is invalid\r\n */\r\nexport function sanitizeBoard(board: StrategyBoard): {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n} {\r\n if (!board || typeof board !== 'object') {\r\n throw new Error('Board must be an object');\r\n }\r\n\r\n if (!Array.isArray(board.objects)) {\r\n throw new Error('Board must have an objects array');\r\n }\r\n\r\n if (board.objects.length > BOUNDS.maxObjects) {\r\n throw new Error(`Board has too many objects (max ${BOUNDS.maxObjects})`);\r\n }\r\n\r\n return {\r\n name: sanitizeName(board.name),\r\n boardBackground: validateBoardBackground(board.boardBackground),\r\n objects: board.objects.map((obj, i) => sanitizeObject(obj, i)),\r\n };\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Binary format builder and parser (TLV format).\r\n */\r\n\r\nimport type { DecodeResult, BackgroundType } from './types';\r\nimport {\r\n ICON_TYPES,\r\n BOARD_BACKGROUND_TYPES,\r\n OBJECT_BACKGROUND_TYPES,\r\n} from './constants';\r\nimport type { sanitizeObject } from './validation';\r\n\r\n/**\r\n * DataView wrapper for reading binary data with bounds checking.\r\n */\r\nclass BinaryReader {\r\n private view: DataView;\r\n private pos: number;\r\n\r\n constructor(data: Uint8Array) {\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.pos = 0;\r\n }\r\n\r\n get position(): number {\r\n return this.pos;\r\n }\r\n\r\n get length(): number {\r\n return this.view.byteLength;\r\n }\r\n\r\n get remaining(): number {\r\n return this.length - this.pos;\r\n }\r\n\r\n seek(pos: number): void {\r\n if (pos < 0 || pos > this.length) {\r\n throw new Error(`Seek position ${pos} out of bounds [0, ${this.length}]`);\r\n }\r\n this.pos = pos;\r\n }\r\n\r\n readUint8(): number {\r\n if (this.pos + 1 > this.length) {\r\n throw new Error('Unexpected end of data reading uint8');\r\n }\r\n const val = this.view.getUint8(this.pos);\r\n this.pos += 1;\r\n return val;\r\n }\r\n\r\n readInt16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading int16');\r\n }\r\n const val = this.view.getInt16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint16(): number {\r\n if (this.pos + 2 > this.length) {\r\n throw new Error('Unexpected end of data reading uint16');\r\n }\r\n const val = this.view.getUint16(this.pos, true); // little-endian\r\n this.pos += 2;\r\n return val;\r\n }\r\n\r\n readUint32(): number {\r\n if (this.pos + 4 > this.length) {\r\n throw new Error('Unexpected end of data reading uint32');\r\n }\r\n const val = this.view.getUint32(this.pos, true); // little-endian\r\n this.pos += 4;\r\n return val;\r\n }\r\n\r\n readBytes(count: number): Uint8Array {\r\n if (this.pos + count > this.length) {\r\n throw new Error(`Unexpected end of data reading ${count} bytes`);\r\n }\r\n const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.pos, count);\r\n this.pos += count;\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Parses decompressed binary data into a strategy board structure.\r\n *\r\n * @param data - Decompressed binary data\r\n * @returns Parsed board structure\r\n * @throws {Error} If binary format is invalid\r\n */\r\nexport function parseBinary(data: Uint8Array): DecodeResult {\r\n if (data.length < 0x1C) {\r\n throw new Error('Binary data is too short for header');\r\n }\r\n\r\n const reader = new BinaryReader(data);\r\n\r\n // Parse header\r\n const version = reader.readUint32();\r\n\r\n // Skip fields at 0x04-0x17\r\n reader.seek(0x18);\r\n reader.readUint16(); // object_count_header (always 1)\r\n\r\n // Read name length at 0x1A\r\n const nameLength = reader.readUint16();\r\n\r\n if (data.length < 0x1C + nameLength) {\r\n throw new Error('Binary data is too short for name field');\r\n }\r\n\r\n // Read name at 0x1C with variable length\r\n const nameBytes = reader.readBytes(nameLength);\r\n const name = new TextDecoder('utf-8', { fatal: false })\r\n .decode(nameBytes)\r\n .replace(/\\0+$/, '')\r\n .trim();\r\n\r\n // Parse icon list (Tag 2 entries) with interleaved text content (Tag 3)\r\n // Text content appears immediately after text icons (iconId 100) in the stream\r\n const icons: number[] = [];\r\n const textContents: string[] = []; // Text content for text objects\r\n while (reader.remaining >= 4) {\r\n const marker = reader.readUint16();\r\n if (marker === 2) {\r\n // Icon entry\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (marker === 3) {\r\n // Tag 3: text content (length > 1) or footer indicator (length = 1)\r\n const val = reader.readUint16();\r\n if (val > 1) {\r\n // Text content - appears after text icon entries\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n } else {\r\n // Footer indicator (val === 1), rewind and let main loop handle it\r\n reader.seek(reader.position - 4);\r\n break;\r\n }\r\n } else {\r\n // Other tag, rewind and break to main tag parsing\r\n reader.seek(reader.position - 2);\r\n break;\r\n }\r\n }\r\n\r\n const n = icons.length;\r\n\r\n // Storage for object properties\r\n const positions: Array<{ x: number; y: number }> = [];\r\n const backgrounds: number[] = []; // Tag 6: also used for rotation angle in rotatable objects\r\n const sizes: number[] = [];\r\n const colors: Array<{ r: number; g: number; b: number; a: number }> = [];\r\n const tag10: number[] = []; // Tag 10: arc angle for fan_aoe, width for line_aoe, horiz count for knockback\r\n const tag11: number[] = []; // Tag 11: donut radius, height for line_aoe, vert count/display count\r\n const tag12: number[] = []; // Tag 12: reserved\r\n const objectFlags: number[] = []; // Per-object flags from Tag 4\r\n let boardBackground = 1; // default: none\r\n\r\n // Parse tags\r\n while (reader.remaining >= 2) {\r\n const tag = reader.readUint16();\r\n\r\n if (tag === 2) {\r\n // Additional icon entry (can appear after text content)\r\n if (reader.remaining < 2) break;\r\n const iconId = reader.readUint16();\r\n icons.push(iconId);\r\n } else if (tag === 4) {\r\n // Object count header with flags\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const countVal = reader.readUint16();\r\n\r\n if (countVal > 1) {\r\n // Multi-object: read per-object flags\r\n if (reader.remaining < countVal * 2) break;\r\n for (let i = 0; i < countVal; i++) {\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else {\r\n // Single object: read flags\r\n if (reader.remaining < 2) break;\r\n objectFlags.push(reader.readUint16());\r\n }\r\n } else if (tag === 5) {\r\n // Positions\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 3\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const x = reader.readInt16() / 10;\r\n const y = reader.readInt16() / 10;\r\n positions.push({ x, y });\r\n }\r\n } else if (tag === 6) {\r\n // Object backgrounds / rotation angles (stored as signed i16)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n // Read as signed to support negative angles\r\n backgrounds.push(reader.readInt16());\r\n }\r\n } else if (tag === 7) {\r\n // Sizes (u8, packed)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 0\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 1; i++) {\r\n sizes.push(reader.readUint8());\r\n }\r\n\r\n // Skip padding byte if odd count\r\n if (count % 2 === 1 && reader.remaining >= 1) {\r\n reader.readUint8();\r\n }\r\n } else if (tag === 8) {\r\n // Colors (RGBA)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 2\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 4; i++) {\r\n const r = reader.readUint8();\r\n const g = reader.readUint8();\r\n const b = reader.readUint8();\r\n const a = reader.readUint8();\r\n colors.push({ r, g, b, a });\r\n }\r\n } else if (tag === 10) {\r\n // Arc angles\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag10.push(reader.readUint16());\r\n }\r\n } else if (tag === 11) {\r\n // Donut radii\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag11.push(reader.readUint16());\r\n }\r\n } else if (tag === 12) {\r\n // Rotation angles (for line_aoe)\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n const count = reader.readUint16();\r\n\r\n for (let i = 0; i < count && reader.remaining >= 2; i++) {\r\n tag12.push(reader.readUint16());\r\n }\r\n } else if (tag === 3) {\r\n // Tag 3 can be:\r\n // - Footer: [3][1][1][board_bg] when second value is 1\r\n // - Text content: [3][text_length][text_bytes...] when second value > 1\r\n if (reader.remaining < 2) break;\r\n const val = reader.readUint16();\r\n\r\n if (val === 1) {\r\n // This is the footer\r\n if (reader.remaining < 4) break;\r\n reader.readUint16(); // always 1\r\n boardBackground = reader.readUint16();\r\n break; // Footer is always last\r\n } else {\r\n // This is text content for a text object\r\n // val is the length of the text content\r\n if (reader.remaining < val) break;\r\n const textBytes = reader.readBytes(val);\r\n const textContent = new TextDecoder('utf-8', { fatal: false })\r\n .decode(textBytes)\r\n .replace(/\\0+$/, ''); // Remove null padding\r\n textContents.push(textContent);\r\n // Continue parsing other tags\r\n }\r\n } else {\r\n // Unknown tag, skip\r\n break;\r\n }\r\n }\r\n\r\n // Build objects array\r\n const objects: DecodeResult['objects'] = [];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const iconId = icons[i];\r\n const typeName = ICON_TYPES[iconId] ?? `unknown_${iconId}`;\r\n\r\n const obj: DecodeResult['objects'][0] = {\r\n type: typeName,\r\n typeId: iconId,\r\n x: positions[i]?.x ?? 0,\r\n y: positions[i]?.y ?? 0,\r\n };\r\n\r\n // Size\r\n obj.size = sizes[i] && sizes[i] > 0 ? sizes[i] : 100;\r\n\r\n // Background vs Angle handling\r\n // For rotatable objects (fan_aoe, line_aoe, line_stack, linear_knockback, line, etc.),\r\n // Tag 6 stores the rotation angle (as signed i16), not the background\r\n const rotatableTypes = new Set([10, 11, 12, 15, 16, 17, 18, 19, 110]); // fan_aoe, line_aoe, line, line_stack, etc.\r\n if (rotatableTypes.has(iconId)) {\r\n // Tag 6 is angle for rotatable objects (can be negative)\r\n if (backgrounds[i] !== undefined && backgrounds[i] !== 0) {\r\n obj.angle = backgrounds[i];\r\n }\r\n } else if (backgrounds[i] !== undefined && backgrounds[i] > 0) {\r\n // Tag 6 is background for non-rotatable objects\r\n const bgName = OBJECT_BACKGROUND_TYPES[backgrounds[i]];\r\n obj.background = bgName as BackgroundType ?? backgrounds[i];\r\n }\r\n\r\n // Color - only for objects with settable colors: line_aoe (11), line (12), text (100)\r\n const colorableTypes = new Set([11, 12, 100]);\r\n if (colors[i]) {\r\n const { r, g, b, a } = colors[i];\r\n // Color is only settable for certain types\r\n if (colorableTypes.has(iconId)) {\r\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\r\n obj.color = hex;\r\n }\r\n // Transparency applies to all objects\r\n if (a > 0) {\r\n obj.transparency = a;\r\n }\r\n }\r\n\r\n // Type-specific handling of Tags 10, 11, 12\r\n if (iconId === 11) {\r\n // line_aoe: Tag 10 = width, Tag 11 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.width = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.height = tag11[i];\r\n }\r\n } else if (iconId === 10) {\r\n // fan_aoe: Tag 10 = arc angle\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n } else if (iconId === 12) {\r\n // line: Tag 10 = endX * 10, Tag 11 = endY * 10, Tag 12 = height\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.endX = tag10[i] / 10;\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.endY = tag11[i] / 10;\r\n }\r\n if (tag12[i] && tag12[i] > 0) {\r\n obj.height = tag12[i];\r\n }\r\n } else if (iconId === 15) {\r\n // line_stack: Tag 11 = display count\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.displayCount = tag11[i];\r\n }\r\n } else if (iconId === 110) {\r\n // linear_knockback: Tag 10 = horizontal count, Tag 11 = vertical count\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.horizontalCount = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.verticalCount = tag11[i];\r\n }\r\n } else if (iconId === 17) {\r\n // donut: Tag 10 = arc angle, Tag 11 = inner radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n } else {\r\n // Default handling for arc angle and donut radius\r\n if (tag10[i] && tag10[i] > 0) {\r\n obj.arcAngle = tag10[i];\r\n }\r\n if (tag11[i] && tag11[i] > 0) {\r\n obj.donutRadius = tag11[i];\r\n }\r\n }\r\n\r\n // Text content for text objects (icon ID 100)\r\n if (iconId === 100 && textContents.length > 0) {\r\n obj.text = textContents.shift();\r\n }\r\n\r\n // Flags from Tag 4: bits encode hidden, horizontal flip, vertical flip, locked\r\n // Bit 0 (0x01): visible (1) / hidden (0)\r\n // Bit 1 (0x02): horizontal flip\r\n // Bit 2 (0x04): vertical flip\r\n // Bit 3 (0x08): locked\r\n const objFlags = objectFlags[i] ?? 1;\r\n if ((objFlags & 0x01) === 0) {\r\n obj.hidden = true;\r\n }\r\n if (objFlags & 0x02) {\r\n obj.horizontalFlip = true;\r\n }\r\n if (objFlags & 0x04) {\r\n obj.verticalFlip = true;\r\n }\r\n if (objFlags & 0x08) {\r\n obj.locked = true;\r\n }\r\n\r\n objects.push(obj);\r\n }\r\n\r\n return {\r\n version,\r\n name: name || undefined,\r\n boardBackground: BOARD_BACKGROUND_TYPES[boardBackground] as BackgroundType ?? 'none',\r\n objects,\r\n };\r\n}\r\n\r\n/**\r\n * Builds binary payload from sanitized board data.\r\n *\r\n * @param data - Sanitized board data from validation\r\n * @returns Binary payload\r\n */\r\nexport function buildBinary(data: {\r\n name: string;\r\n boardBackground: number;\r\n objects: ReturnType<typeof sanitizeObject>[];\r\n}): Uint8Array {\r\n const { name, boardBackground, objects } = data;\r\n const n = objects.length;\r\n\r\n // Calculate required buffer size\r\n // Header: 0x24 bytes (36 bytes)\r\n // Tag 2 entries: n * 4 bytes\r\n // Tag 4: 8 bytes for single, 6 + n*2 for multi\r\n // Tag 5 (positions): 6 + n * 4\r\n // Tag 6 (backgrounds): 6 + n * 2\r\n // Tag 7 (sizes): 6 + n + (n % 2 === 1 ? 1 : 0) padding\r\n // Tag 8 (colors): 6 + n * 4\r\n // Tag 10 (arc): 6 + n * 2\r\n // Tag 11 (donut): 6 + n * 2\r\n // Tag 12 (reserved): 6 + n * 2\r\n // Tag 3 (footer): 8\r\n const tag4Size = n <= 1 ? 8 : (6 + n * 2);\r\n const tag7Size = 6 + n + (n % 2 === 1 ? 1 : 0);\r\n const bufferSize = n === 0\r\n ? 0x24 + 8 // Header + footer only\r\n : 0x24 + n * 4 + tag4Size + (6 + n * 4) + (6 + n * 2) + tag7Size + (6 + n * 4) + (6 + n * 2) + (6 + n * 2) + (6 + n * 2) + 8;\r\n\r\n const buffer = new ArrayBuffer(bufferSize);\r\n const view = new DataView(buffer);\r\n let pos = 0;\r\n\r\n // Helper to write values\r\n const writeUint8 = (val: number) => {\r\n view.setUint8(pos, val);\r\n pos += 1;\r\n };\r\n const writeUint16 = (val: number) => {\r\n view.setUint16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeInt16 = (val: number) => {\r\n view.setInt16(pos, val, true);\r\n pos += 2;\r\n };\r\n const writeUint32 = (val: number) => {\r\n view.setUint32(pos, val, true);\r\n pos += 4;\r\n };\r\n\r\n // Header (0x00 - 0x23)\r\n writeUint32(2); // Version\r\n writeUint32(0); // Field at 0x04 - will update\r\n for (let i = 0; i < 10; i++) writeUint8(0); // Padding\r\n writeUint32(0); // Payload size - will update\r\n writeUint16(0); // Padding\r\n writeUint16(1); // Object count header\r\n writeUint16(8); // Name length\r\n\r\n // Name (8 bytes, null-padded)\r\n const nameBytes = new TextEncoder().encode(name.slice(0, 7));\r\n for (let i = 0; i < 8; i++) {\r\n writeUint8(nameBytes[i] ?? 0);\r\n }\r\n\r\n // Object list (Tag 2 entries)\r\n for (const obj of objects) {\r\n writeUint16(2);\r\n writeUint16(obj.typeId);\r\n }\r\n\r\n // Skip property tags for empty boards\r\n if (n === 0) {\r\n // Just write footer\r\n } else if (n === 1) {\r\n // Tag 4 - Single object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n const obj = objects[0];\r\n let flagsVal = 1; // visible\r\n if (obj.hidden) {\r\n flagsVal = 0;\r\n } else if (obj.locked) {\r\n flagsVal = 9;\r\n }\r\n writeUint16(1);\r\n writeUint16(flagsVal);\r\n } else {\r\n // Tag 4 - Multi-object header\r\n writeUint16(4);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(1);\r\n }\r\n }\r\n\r\n // Only write property tags if there are objects\r\n if (n > 0) {\r\n // Tag 5 - Positions\r\n writeUint16(5);\r\n writeUint16(3);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeInt16(Math.round(obj.x * 10));\r\n writeInt16(Math.round(obj.y * 10));\r\n }\r\n\r\n // Tag 6 - Object backgrounds\r\n writeUint16(6);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.background);\r\n }\r\n\r\n // Tag 7 - Sizes\r\n writeUint16(7);\r\n writeUint16(0);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.size & 0xff);\r\n }\r\n // Padding if odd count\r\n if (n % 2 === 1) {\r\n writeUint8(0);\r\n }\r\n\r\n // Tag 8 - Colors\r\n writeUint16(8);\r\n writeUint16(2);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint8(obj.colorR);\r\n writeUint8(obj.colorG);\r\n writeUint8(obj.colorB);\r\n writeUint8(obj.transparency);\r\n }\r\n\r\n // Tag 10 - Arc angles\r\n writeUint16(10);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.arcAngle);\r\n }\r\n\r\n // Tag 11 - Donut radii\r\n writeUint16(11);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (const obj of objects) {\r\n writeUint16(obj.donutRadius);\r\n }\r\n\r\n // Tag 12 - Reserved\r\n writeUint16(12);\r\n writeUint16(1);\r\n writeUint16(n);\r\n for (let i = 0; i < n; i++) {\r\n writeUint16(0);\r\n }\r\n }\r\n\r\n // Tag 3 - Footer\r\n writeUint16(3);\r\n writeUint16(1);\r\n writeUint16(1);\r\n writeUint16(boardBackground);\r\n\r\n // Trim to actual size\r\n const result = new Uint8Array(buffer, 0, pos);\r\n\r\n // Update sizes in header\r\n const headerView = new DataView(result.buffer, result.byteOffset, result.byteLength);\r\n const payloadSize = pos - 0x1c;\r\n headerView.setUint32(0x12, payloadSize, true);\r\n const field04 = pos - 16;\r\n headerView.setUint32(0x04, field04, true);\r\n\r\n return result;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Cipher encoding and decoding (obfuscation layer).\r\n */\r\n\r\nimport pako from 'pako';\r\nimport {\r\n CIPHER_TABLE,\r\n KEY_REVERSE,\r\n INVERSE_MAPPING,\r\n FORWARD_MAPPING,\r\n} from './constants';\r\n\r\n/**\r\n * Converts a standard Base64 character to its 6-bit value (0-63).\r\n *\r\n * @param c - Single character\r\n * @returns 6-bit value\r\n */\r\nexport function charToBase64Value(c: string): number {\r\n const o = c.charCodeAt(0);\r\n\r\n // A-Z = 0-25\r\n if (o >= 65 && o <= 90) return o - 65;\r\n // a-z = 26-51\r\n if (o >= 97 && o <= 122) return o - 71;\r\n // 0-9 = 52-61\r\n if (o >= 48 && o <= 57) return o + 4;\r\n // URL-safe variants\r\n if (c === '-') return 62;\r\n if (c === '_') return 63;\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Converts a 6-bit value (0-63) to a standard Base64 character.\r\n *\r\n * @param val - 6-bit value\r\n * @returns Base64 character\r\n */\r\nexport function base64ValueToChar(val: number): string {\r\n val = val & 63; // Ensure 6-bit range\r\n\r\n if (val < 26) return String.fromCharCode(val + 65); // A-Z\r\n if (val < 52) return String.fromCharCode(val + 71); // a-z\r\n if (val < 62) return String.fromCharCode(val - 4); // 0-9\r\n if (val === 62) return '-';\r\n if (val === 63) return '_';\r\n\r\n return 'A';\r\n}\r\n\r\n/**\r\n * Decodes an obfuscated share code string to binary data.\r\n *\r\n * @param stgyString - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decompressed binary data\r\n * @throws {Error} If decoding fails\r\n */\r\nexport function decodeCipher(stgyString: string): Uint8Array {\r\n // Extract body: [stgy:a<body>]\r\n const data = stgyString.slice(7, -1);\r\n\r\n if (data.length < 2) {\r\n throw new Error('Share code body is too short');\r\n }\r\n\r\n // First character encodes the cipher key\r\n const keyChar = data[0];\r\n const keyCharCode = keyChar.charCodeAt(0);\r\n\r\n if (keyCharCode >= CIPHER_TABLE.length) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMapped = CIPHER_TABLE[keyCharCode];\r\n if (keyMapped === 0) {\r\n throw new Error('Invalid key character in share code');\r\n }\r\n\r\n const keyMappedChar = String.fromCharCode(keyMapped);\r\n const key = charToBase64Value(keyMappedChar);\r\n\r\n // Decode remaining characters\r\n const decoded: string[] = [];\r\n\r\n for (let i = 0; i < data.length - 1; i++) {\r\n const c = data[i + 1];\r\n const charCode = c.charCodeAt(0);\r\n\r\n // Apply inverse substitution\r\n const standardCharCode = INVERSE_MAPPING[charCode] ?? 65; // Default to 'A'\r\n const standardChar = String.fromCharCode(standardCharCode);\r\n\r\n // Get base64 value and apply reverse shift\r\n const val = charToBase64Value(standardChar);\r\n const decodedVal = (val - i - key) & 63;\r\n\r\n decoded.push(base64ValueToChar(decodedVal));\r\n }\r\n\r\n // Convert URL-safe Base64 to standard Base64\r\n let b64String = decoded.join('').replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // Add proper padding based on length\r\n const padLength = (4 - (b64String.length % 4)) % 4;\r\n b64String += '='.repeat(padLength);\r\n\r\n // Decode Base64\r\n const binaryString = atob(b64String);\r\n const binaryData = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n binaryData[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Skip 6-byte header and decompress\r\n if (binaryData.length < 7) {\r\n throw new Error('Binary data is too short');\r\n }\r\n\r\n try {\r\n const compressed = binaryData.slice(6);\r\n return pako.inflate(compressed);\r\n } catch (e) {\r\n throw new Error(`Failed to decompress data: ${e instanceof Error ? e.message : 'unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Encodes binary data to an obfuscated share code string.\r\n *\r\n * @param binaryData - Binary data to encode\r\n * @param key - Optional cipher key (0-63), random if not provided\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n */\r\nexport function encodeCipher(binaryData: Uint8Array, key?: number): string {\r\n // Compress the data\r\n const compressed = pako.deflate(binaryData, { level: 6 });\r\n\r\n // Build header: [u32 checksum][u16 length]\r\n const length = binaryData.length;\r\n const lengthBytes = new Uint8Array(2);\r\n lengthBytes[0] = length & 0xff;\r\n lengthBytes[1] = (length >> 8) & 0xff;\r\n\r\n // Calculate CRC32 of length + compressed data\r\n const checksumInput = new Uint8Array(2 + compressed.length);\r\n checksumInput.set(lengthBytes, 0);\r\n checksumInput.set(compressed, 2);\r\n const checksum = crc32(checksumInput);\r\n\r\n // Build full payload: header + compressed\r\n const fullData = new Uint8Array(6 + compressed.length);\r\n fullData[0] = checksum & 0xff;\r\n fullData[1] = (checksum >> 8) & 0xff;\r\n fullData[2] = (checksum >> 16) & 0xff;\r\n fullData[3] = (checksum >> 24) & 0xff;\r\n fullData[4] = lengthBytes[0];\r\n fullData[5] = lengthBytes[1];\r\n fullData.set(compressed, 6);\r\n\r\n // Convert to Base64\r\n let b64 = '';\r\n for (let i = 0; i < fullData.length; i++) {\r\n b64 += String.fromCharCode(fullData[i]);\r\n }\r\n b64 = btoa(b64);\r\n\r\n // Convert to URL-safe Base64 and remove padding\r\n b64 = b64.replace(/=+$/, '').replace(/\\+/g, '-').replace(/\\//g, '_');\r\n\r\n // Use provided key or generate random\r\n if (key === undefined || key < 0 || key > 63) {\r\n key = Math.floor(Math.random() * 64);\r\n }\r\n\r\n // Get key character for output\r\n const keyCharStandard = base64ValueToChar(key);\r\n const keyCharCode = keyCharStandard.charCodeAt(0);\r\n const keySource = KEY_REVERSE[keyCharCode] ?? 86; // Default to 'V'\r\n\r\n // Encode each character\r\n const encoded: string[] = [];\r\n\r\n for (let i = 0; i < b64.length; i++) {\r\n const c = b64[i];\r\n const val = charToBase64Value(c);\r\n const encodedVal = (val + i + key) & 63;\r\n const standardChar = base64ValueToChar(encodedVal);\r\n const standardCharCode = standardChar.charCodeAt(0);\r\n const substChar = FORWARD_MAPPING[standardCharCode] ?? 65; // Default to 'A'\r\n encoded.push(String.fromCharCode(substChar));\r\n }\r\n\r\n return `[stgy:a${String.fromCharCode(keySource)}${encoded.join('')}]`;\r\n}\r\n\r\n/**\r\n * CRC32 implementation (same as zlib.crc32).\r\n */\r\nfunction crc32(data: Uint8Array): number {\r\n let crc = 0xffffffff;\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n crc ^= data[i];\r\n for (let j = 0; j < 8; j++) {\r\n if (crc & 1) {\r\n crc = (crc >>> 1) ^ 0xedb88320;\r\n } else {\r\n crc = crc >>> 1;\r\n }\r\n }\r\n }\r\n\r\n return (crc ^ 0xffffffff) >>> 0;\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board encoder (JSON → share code).\r\n */\r\n\r\nimport type { StrategyBoard, EncodeOptions } from './types';\r\nimport { sanitizeBoard } from './validation';\r\nimport { buildBinary } from './binary';\r\nimport { encodeCipher } from './cipher';\r\n\r\n/**\r\n * Encodes a strategy board to a share code.\r\n *\r\n * @param board - Strategy board to encode\r\n * @param options - Optional encoding options\r\n * @returns Share code string (e.g., \"[stgy:a...]\")\r\n * @throws {Error} If board data is invalid\r\n *\r\n * @example\r\n * ```ts\r\n * import { encode } from 'xiv-strat-board';\r\n *\r\n * const shareCode = encode({\r\n * name: 'myboard',\r\n * boardBackground: 'checkered',\r\n * objects: [\r\n * { type: 'tank', x: 256, y: 192, size: 100 },\r\n * { type: 'healer', x: 300, y: 192, size: 100 },\r\n * ],\r\n * });\r\n *\r\n * console.log(shareCode); // \"[stgy:a...]\"\r\n * ```\r\n */\r\nexport function encode(board: StrategyBoard, options?: EncodeOptions): string {\r\n // Validate and sanitize input\r\n const sanitized = sanitizeBoard(board);\r\n\r\n // Build binary format\r\n const binary = buildBinary(sanitized);\r\n\r\n // Encode with cipher\r\n return encodeCipher(binary, options?.key);\r\n}\r\n","/**\r\n * xiv-strat-board - FF14 Strategy Board Encoder/Decoder\r\n *\r\n * Strategy board decoder (share code → JSON).\r\n */\r\n\r\nimport type { DecodeResult } from './types';\r\nimport { validateShareCode } from './validation';\r\nimport { decodeCipher } from './cipher';\r\nimport { parseBinary } from './binary';\r\n\r\n/**\r\n * Decodes a share code to a strategy board.\r\n *\r\n * @param shareCode - Share code string (e.g., \"[stgy:a...]\")\r\n * @returns Decoded strategy board\r\n * @throws {Error} If share code is invalid or malformed\r\n *\r\n * @example\r\n * ```ts\r\n * import { decode } from 'xiv-strat-board';\r\n *\r\n * const board = decode('[stgy:aVe......]');\r\n *\r\n * console.log(board.name);\r\n * console.log(board.objects.length);\r\n * for (const obj of board.objects) {\r\n * console.log(`${obj.type} at (${obj.x}, ${obj.y})`);\r\n * }\r\n * ```\r\n */\r\nexport function decode(shareCode: string): DecodeResult {\r\n // Validate share code format\r\n validateShareCode(shareCode);\r\n\r\n // Decode cipher and decompress\r\n const binary = decodeCipher(shareCode);\r\n\r\n // Parse binary format\r\n return parseBinary(binary);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xiv-strat-board",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Encoder and decoder for FF14 Strategy Board share codes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",