diff --git a/HanjaKanaMun.dSYM/Contents/Info.plist b/HanjaKanaMun.dSYM/Contents/Info.plist new file mode 100644 index 0000000..09ebc84 --- /dev/null +++ b/HanjaKanaMun.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.HanjaKanaMun + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/HanjaKanaMun.dSYM/Contents/Resources/Relocations/aarch64/HanjaKanaMun.yml b/HanjaKanaMun.dSYM/Contents/Resources/Relocations/aarch64/HanjaKanaMun.yml new file mode 100644 index 0000000..040f5cd --- /dev/null +++ b/HanjaKanaMun.dSYM/Contents/Resources/Relocations/aarch64/HanjaKanaMun.yml @@ -0,0 +1,1156 @@ +--- +triple: 'arm64-apple-darwin' +binary-path: '/Users/sebastian/projects/HanjaKanaMun/HanjaKanaMun' +relocations: + - { offset: 0x1F, size: 0x8, addend: 0x0, symName: '_main::parent_screen', symObjAddr: 0x0, symBinAddr: 0x100000FE8, symSize: 0xE4 } + - { offset: 0x1B0, size: 0x8, addend: 0x0, symName: '_main::parent_screen', symObjAddr: 0x0, symBinAddr: 0x100000FE8, symSize: 0xE4 } + - { offset: 0x1B8, size: 0x8, addend: 0x0, symName: '_main::main', symObjAddr: 0xE4, symBinAddr: 0x1000010CC, symSize: 0x440 } + - { offset: 0x1F3, size: 0x8, addend: 0x0, symName: '_main::main', symObjAddr: 0xE4, symBinAddr: 0x1000010CC, symSize: 0x440 } + - { offset: 0x76A, size: 0x8, addend: 0x0, symName: ___floattidf, symObjAddr: 0x0, symBinAddr: 0x10000150C, symSize: 0x320 } + - { offset: 0x797, size: 0x8, addend: 0x0, symName: ___floattidf, symObjAddr: 0x0, symBinAddr: 0x10000150C, symSize: 0x320 } + - { offset: 0x79F, size: 0x8, addend: 0x0, symName: ___floattidf_unsigned, symObjAddr: 0x320, symBinAddr: 0x10000182C, symSize: 0x2E4 } + - { offset: 0x7D1, size: 0x8, addend: 0x0, symName: ___floattidf_unsigned, symObjAddr: 0x320, symBinAddr: 0x10000182C, symSize: 0x2E4 } + - { offset: 0x82A, size: 0x8, addend: 0x0, symName: ___floattidf_unsigned, symObjAddr: 0x320, symBinAddr: 0x10000182C, symSize: 0x2E4 } + - { offset: 0x832, size: 0x8, addend: 0x0, symName: ___umodti3, symObjAddr: 0x604, symBinAddr: 0x100001B10, symSize: 0x7C } + - { offset: 0x864, size: 0x8, addend: 0x0, symName: ___umodti3, symObjAddr: 0x604, symBinAddr: 0x100001B10, symSize: 0x7C } + - { offset: 0x8AD, size: 0x8, addend: 0x0, symName: ___umodti3, symObjAddr: 0x604, symBinAddr: 0x100001B10, symSize: 0x7C } + - { offset: 0x8B5, size: 0x8, addend: 0x0, symName: ___udivmodti4, symObjAddr: 0x680, symBinAddr: 0x100001B8C, symSize: 0x74 } + - { offset: 0x8F6, size: 0x8, addend: 0x0, symName: ___udivmodti4, symObjAddr: 0x680, symBinAddr: 0x100001B8C, symSize: 0x74 } + - { offset: 0x911, size: 0x8, addend: 0x0, symName: ___udivmodti4, symObjAddr: 0x680, symBinAddr: 0x100001B8C, symSize: 0x74 } + - { offset: 0x919, size: 0x8, addend: 0x0, symName: ___udivti3, symObjAddr: 0x6F4, symBinAddr: 0x100001C00, symSize: 0x68 } + - { offset: 0x962, size: 0x8, addend: 0x0, symName: ___udivti3, symObjAddr: 0x6F4, symBinAddr: 0x100001C00, symSize: 0x68 } + - { offset: 0x96A, size: 0x8, addend: 0x0, symName: ___modti3, symObjAddr: 0x75C, symBinAddr: 0x100001C68, symSize: 0x1A4 } + - { offset: 0x9A4, size: 0x8, addend: 0x0, symName: ___modti3, symObjAddr: 0x75C, symBinAddr: 0x100001C68, symSize: 0x1A4 } + - { offset: 0xAD4, size: 0x8, addend: 0x0, symName: '_io::to_writer', symObjAddr: 0x0, symBinAddr: 0x100001E0C, symSize: 0xAC } + - { offset: 0xCCF, size: 0x8, addend: 0x0, symName: '_io::to_writer', symObjAddr: 0x0, symBinAddr: 0x100001E0C, symSize: 0xAC } + - { offset: 0xCD7, size: 0x8, addend: 0x0, symName: '_io::write_u64', symObjAddr: 0xAC, symBinAddr: 0x100001EB8, symSize: 0x180 } + - { offset: 0xD31, size: 0x8, addend: 0x0, symName: '_io::write_u64', symObjAddr: 0xAC, symBinAddr: 0x100001EB8, symSize: 0x180 } + - { offset: 0xD39, size: 0x8, addend: 0x0, symName: '_io::write_i64', symObjAddr: 0x22C, symBinAddr: 0x100002038, symSize: 0x184 } + - { offset: 0xDC9, size: 0x8, addend: 0x0, symName: '_io::write_i64', symObjAddr: 0x22C, symBinAddr: 0x100002038, symSize: 0x184 } + - { offset: 0xDF4, size: 0x8, addend: 0x0, symName: '_io::write_i64', symObjAddr: 0x22C, symBinAddr: 0x100002038, symSize: 0x184 } + - { offset: 0xDFC, size: 0x8, addend: 0x0, symName: '_io::write_int', symObjAddr: 0x3B0, symBinAddr: 0x1000021BC, symSize: 0xAC } + - { offset: 0xE8C, size: 0x8, addend: 0x0, symName: '_io::write_int', symObjAddr: 0x3B0, symBinAddr: 0x1000021BC, symSize: 0xAC } + - { offset: 0xEB7, size: 0x8, addend: 0x0, symName: '_io::write_int', symObjAddr: 0x3B0, symBinAddr: 0x1000021BC, symSize: 0xAC } + - { offset: 0xEBF, size: 0x8, addend: 0x0, symName: '_io::query', symObjAddr: 0x45C, symBinAddr: 0x100002268, symSize: 0xC4 } + - { offset: 0xF47, size: 0x8, addend: 0x0, symName: '_io::query', symObjAddr: 0x45C, symBinAddr: 0x100002268, symSize: 0xC4 } + - { offset: 0xF4F, size: 0x8, addend: 0x0, symName: '_io::query_utility', symObjAddr: 0x520, symBinAddr: 0x10000232C, symSize: 0x3C } + - { offset: 0xFBB, size: 0x8, addend: 0x0, symName: '_io::query_utility', symObjAddr: 0x520, symBinAddr: 0x10000232C, symSize: 0x3C } + - { offset: 0xFC3, size: 0x8, addend: 0x0, symName: '_io::n_wrapper', symObjAddr: 0x55C, symBinAddr: 0x100002368, symSize: 0x44 } + - { offset: 0x100B, size: 0x8, addend: 0x0, symName: '_io::n_wrapper', symObjAddr: 0x55C, symBinAddr: 0x100002368, symSize: 0x44 } + - { offset: 0x1013, size: 0x8, addend: 0x0, symName: '_io::write_encoded_rune', symObjAddr: 0x5A0, symBinAddr: 0x1000023AC, symSize: 0xD88 } + - { offset: 0x1059, size: 0x8, addend: 0x0, symName: '_io::write_encoded_rune', symObjAddr: 0x5A0, symBinAddr: 0x1000023AC, symSize: 0xD88 } + - { offset: 0x1061, size: 0x8, addend: 0x0, symName: '_io::write', symObjAddr: 0x1328, symBinAddr: 0x100003134, symSize: 0x13C } + - { offset: 0x110F, size: 0x8, addend: 0x0, symName: '_io::write', symObjAddr: 0x1328, symBinAddr: 0x100003134, symSize: 0x13C } + - { offset: 0x1117, size: 0x8, addend: 0x0, symName: '_io::write_escaped_rune', symObjAddr: 0x1464, symBinAddr: 0x100003270, symSize: 0x22C8 } + - { offset: 0x11B2, size: 0x8, addend: 0x0, symName: '_io::write_escaped_rune', symObjAddr: 0x1464, symBinAddr: 0x100003270, symSize: 0x22C8 } + - { offset: 0x11BA, size: 0x8, addend: 0x0, symName: '_io::flush', symObjAddr: 0x372C, symBinAddr: 0x100005538, symSize: 0x98 } + - { offset: 0x12FB, size: 0x8, addend: 0x0, symName: '_io::flush', symObjAddr: 0x372C, symBinAddr: 0x100005538, symSize: 0x98 } + - { offset: 0x1303, size: 0x8, addend: 0x0, symName: '_io::write_byte', symObjAddr: 0x37C4, symBinAddr: 0x1000055D0, symSize: 0xD0 } + - { offset: 0x134E, size: 0x8, addend: 0x0, symName: '_io::write_byte', symObjAddr: 0x37C4, symBinAddr: 0x1000055D0, symSize: 0xD0 } + - { offset: 0x1356, size: 0x8, addend: 0x0, symName: '_io::write_quoted_string', symObjAddr: 0x3894, symBinAddr: 0x1000056A0, symSize: 0x890 } + - { offset: 0x13BB, size: 0x8, addend: 0x0, symName: '_io::write_quoted_string', symObjAddr: 0x3894, symBinAddr: 0x1000056A0, symSize: 0x890 } + - { offset: 0x13D7, size: 0x8, addend: 0x0, symName: '_io::write_quoted_string', symObjAddr: 0x3894, symBinAddr: 0x1000056A0, symSize: 0x890 } + - { offset: 0x13DF, size: 0x8, addend: 0x0, symName: '_io::write_string', symObjAddr: 0x4124, symBinAddr: 0x100005F30, symSize: 0xC4 } + - { offset: 0x14BF, size: 0x8, addend: 0x0, symName: '_io::write_string', symObjAddr: 0x4124, symBinAddr: 0x100005F30, symSize: 0xC4 } + - { offset: 0x14C7, size: 0x8, addend: 0x0, symName: '_io::write_quoted_string16', symObjAddr: 0x41E8, symBinAddr: 0x100005FF4, symSize: 0x890 } + - { offset: 0x1547, size: 0x8, addend: 0x0, symName: '_io::write_quoted_string16', symObjAddr: 0x41E8, symBinAddr: 0x100005FF4, symSize: 0x890 } + - { offset: 0x154F, size: 0x8, addend: 0x0, symName: '_io::write_string16', symObjAddr: 0x4A78, symBinAddr: 0x100006884, symSize: 0x3B4 } + - { offset: 0x162F, size: 0x8, addend: 0x0, symName: '_io::write_string16', symObjAddr: 0x4A78, symBinAddr: 0x100006884, symSize: 0x3B4 } + - { offset: 0x1637, size: 0x8, addend: 0x0, symName: '_io::write_rune', symObjAddr: 0x4E2C, symBinAddr: 0x100006C38, symSize: 0x294 } + - { offset: 0x1732, size: 0x8, addend: 0x0, symName: '_io::write_rune', symObjAddr: 0x4E2C, symBinAddr: 0x100006C38, symSize: 0x294 } + - { offset: 0x173A, size: 0x8, addend: 0x0, symName: '_io::write_quoted_rune', symObjAddr: 0x50C0, symBinAddr: 0x100006ECC, symSize: 0x318 } + - { offset: 0x17C2, size: 0x8, addend: 0x0, symName: '_io::write_quoted_rune', symObjAddr: 0x50C0, symBinAddr: 0x100006ECC, symSize: 0x318 } + - { offset: 0x17EF, size: 0x8, addend: 0x0, symName: '_io::write_quoted_rune', symObjAddr: 0x50C0, symBinAddr: 0x100006ECC, symSize: 0x318 } + - { offset: 0x17F7, size: 0x8, addend: 0x0, symName: '_io::write_escaped_rune.is_printable-0', symObjAddr: 0x53D8, symBinAddr: 0x1000071E4, symSize: 0xA0 } + - { offset: 0x185E, size: 0x8, addend: 0x0, symName: '_io::write_escaped_rune.is_printable-0', symObjAddr: 0x53D8, symBinAddr: 0x1000071E4, symSize: 0xA0 } + - { offset: 0x18BF, size: 0x8, addend: 0x0, symName: '_io::write_escaped_rune.is_printable-0', symObjAddr: 0x53D8, symBinAddr: 0x1000071E4, symSize: 0xA0 } + - { offset: 0x18C7, size: 0x8, addend: 0x0, symName: '_io::write_quoted_rune._write_byte-0', symObjAddr: 0x5478, symBinAddr: 0x100007284, symSize: 0x80 } + - { offset: 0x18F1, size: 0x8, addend: 0x0, symName: '_io::write_quoted_rune._write_byte-0', symObjAddr: 0x5478, symBinAddr: 0x100007284, symSize: 0x80 } + - { offset: 0x1EE2, size: 0x8, addend: 0x0, symName: '_os::[allocators.odin]::init_thread_local_cleaner', symObjAddr: 0x0, symBinAddr: 0x100007304, symSize: 0x74 } + - { offset: 0x2447, size: 0x8, addend: 0x0, symName: '_os::[allocators.odin]::init_thread_local_cleaner', symObjAddr: 0x0, symBinAddr: 0x100007304, symSize: 0x74 } + - { offset: 0x244F, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::init_std_files', symObjAddr: 0x74, symBinAddr: 0x100007378, symSize: 0x88 } + - { offset: 0x2466, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::init_std_files', symObjAddr: 0x74, symBinAddr: 0x100007378, symSize: 0x88 } + - { offset: 0x246E, size: 0x8, addend: 0x0, symName: '_os::[process.odin]::delete_args', symObjAddr: 0xFC, symBinAddr: 0x100007400, symSize: 0xFC } + - { offset: 0x2485, size: 0x8, addend: 0x0, symName: '_os::[process.odin]::delete_args', symObjAddr: 0xFC, symBinAddr: 0x100007400, symSize: 0xFC } + - { offset: 0x248D, size: 0x8, addend: 0x0, symName: '_os::[allocators.odin]::temp_allocator_fini', symObjAddr: 0x1F8, symBinAddr: 0x1000074FC, symSize: 0x90 } + - { offset: 0x24C7, size: 0x8, addend: 0x0, symName: '_os::[allocators.odin]::temp_allocator_fini', symObjAddr: 0x1F8, symBinAddr: 0x1000074FC, symSize: 0x90 } + - { offset: 0x24CF, size: 0x8, addend: 0x0, symName: '_os::heap_allocator', symObjAddr: 0x288, symBinAddr: 0x10000758C, symSize: 0x28 } + - { offset: 0x2508, size: 0x8, addend: 0x0, symName: '_os::heap_allocator', symObjAddr: 0x288, symBinAddr: 0x10000758C, symSize: 0x28 } + - { offset: 0x2510, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::internal_stat', symObjAddr: 0x2B0, symBinAddr: 0x1000075B4, symSize: 0x2BC } + - { offset: 0x252B, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::internal_stat', symObjAddr: 0x2B0, symBinAddr: 0x1000075B4, symSize: 0x2BC } + - { offset: 0x2533, size: 0x8, addend: 0x0, symName: '_os::[path_posix.odin]::_is_path_separator', symObjAddr: 0x56C, symBinAddr: 0x100007870, symSize: 0x24 } + - { offset: 0x258D, size: 0x8, addend: 0x0, symName: '_os::[path_posix.odin]::_is_path_separator', symObjAddr: 0x56C, symBinAddr: 0x100007870, symSize: 0x24 } + - { offset: 0x2595, size: 0x8, addend: 0x0, symName: '_os::[errors_posix.odin]::_get_platform_error_from_errno', symObjAddr: 0x590, symBinAddr: 0x100007894, symSize: 0x40 } + - { offset: 0x25BF, size: 0x8, addend: 0x0, symName: '_os::[errors_posix.odin]::_get_platform_error_from_errno', symObjAddr: 0x590, symBinAddr: 0x100007894, symSize: 0x40 } + - { offset: 0x25C7, size: 0x8, addend: 0x0, symName: '_os::heap_allocator_proc', symObjAddr: 0x5D0, symBinAddr: 0x1000078D4, symSize: 0xAC } + - { offset: 0x25F3, size: 0x8, addend: 0x0, symName: '_os::heap_allocator_proc', symObjAddr: 0x5D0, symBinAddr: 0x1000078D4, symSize: 0xAC } + - { offset: 0x25FB, size: 0x8, addend: 0x0, symName: '_os::[errors_posix.odin]::_get_platform_error_existing', symObjAddr: 0x67C, symBinAddr: 0x100007980, symSize: 0x390 } + - { offset: 0x2690, size: 0x8, addend: 0x0, symName: '_os::[errors_posix.odin]::_get_platform_error_existing', symObjAddr: 0x67C, symBinAddr: 0x100007980, symSize: 0x390 } + - { offset: 0x2698, size: 0x8, addend: 0x0, symName: '_os::[internal_util.odin]::clone_string', symObjAddr: 0xA0C, symBinAddr: 0x100007D10, symSize: 0x178 } + - { offset: 0x26D2, size: 0x8, addend: 0x0, symName: '_os::[internal_util.odin]::clone_string', symObjAddr: 0xA0C, symBinAddr: 0x100007D10, symSize: 0x178 } + - { offset: 0x26DA, size: 0x8, addend: 0x0, symName: '_os::[path_posixfs.odin]::_split_path', symObjAddr: 0xB84, symBinAddr: 0x100007E88, symSize: 0x300 } + - { offset: 0x274B, size: 0x8, addend: 0x0, symName: '_os::[path_posixfs.odin]::_split_path', symObjAddr: 0xB84, symBinAddr: 0x100007E88, symSize: 0x300 } + - { offset: 0x2766, size: 0x8, addend: 0x0, symName: '_os::[path_posixfs.odin]::_split_path', symObjAddr: 0xB84, symBinAddr: 0x100007E88, symSize: 0x300 } + - { offset: 0x276E, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::_fstat', symObjAddr: 0xE84, symBinAddr: 0x100008188, symSize: 0x424 } + - { offset: 0x27D0, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::_fstat', symObjAddr: 0xE84, symBinAddr: 0x100008188, symSize: 0x424 } + - { offset: 0x27EB, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::_fstat', symObjAddr: 0xE84, symBinAddr: 0x100008188, symSize: 0x424 } + - { offset: 0x27F3, size: 0x8, addend: 0x0, symName: '_os::[file_stream.odin]::file_stream_fstat_utility', symObjAddr: 0x12A8, symBinAddr: 0x1000085AC, symSize: 0x264 } + - { offset: 0x2864, size: 0x8, addend: 0x0, symName: '_os::[file_stream.odin]::file_stream_fstat_utility', symObjAddr: 0x12A8, symBinAddr: 0x1000085AC, symSize: 0x264 } + - { offset: 0x289F, size: 0x8, addend: 0x0, symName: '_os::[file_stream.odin]::file_stream_fstat_utility', symObjAddr: 0x12A8, symBinAddr: 0x1000085AC, symSize: 0x264 } + - { offset: 0x28A7, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_close', symObjAddr: 0x150C, symBinAddr: 0x100008810, symSize: 0x11C } + - { offset: 0x2917, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_close', symObjAddr: 0x150C, symBinAddr: 0x100008810, symSize: 0x11C } + - { offset: 0x2932, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_close', symObjAddr: 0x150C, symBinAddr: 0x100008810, symSize: 0x11C } + - { offset: 0x293A, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::__fd', symObjAddr: 0x1628, symBinAddr: 0x10000892C, symSize: 0x60 } + - { offset: 0x298C, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::__fd', symObjAddr: 0x1628, symBinAddr: 0x10000892C, symSize: 0x60 } + - { offset: 0x29A7, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::__fd', symObjAddr: 0x1628, symBinAddr: 0x10000892C, symSize: 0x60 } + - { offset: 0x29AF, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_sync', symObjAddr: 0x1688, symBinAddr: 0x10000898C, symSize: 0x80 } + - { offset: 0x29D9, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_sync', symObjAddr: 0x1688, symBinAddr: 0x10000898C, symSize: 0x80 } + - { offset: 0x29E1, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_file_stream_proc', symObjAddr: 0x1708, symBinAddr: 0x100008A0C, symSize: 0xD98 } + - { offset: 0x2A1B, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::_file_stream_proc', symObjAddr: 0x1708, symBinAddr: 0x100008A0C, symSize: 0xD98 } + - { offset: 0x2A23, size: 0x8, addend: 0x0, symName: '_os::split_path', symObjAddr: 0x24A0, symBinAddr: 0x1000097A4, symSize: 0xBC } + - { offset: 0x2ADA, size: 0x8, addend: 0x0, symName: '_os::split_path', symObjAddr: 0x24A0, symBinAddr: 0x1000097A4, symSize: 0xBC } + - { offset: 0x2B0D, size: 0x8, addend: 0x0, symName: '_os::split_path', symObjAddr: 0x24A0, symBinAddr: 0x1000097A4, symSize: 0xBC } + - { offset: 0x2C3E, size: 0x8, addend: 0x0, symName: '_os::split_path', symObjAddr: 0x24A0, symBinAddr: 0x1000097A4, symSize: 0xBC } + - { offset: 0x2C46, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::internal_stat.timespec_time-0', symObjAddr: 0x255C, symBinAddr: 0x100009860, symSize: 0x5C } + - { offset: 0x2CA6, size: 0x8, addend: 0x0, symName: '_os::[stat_posix.odin]::internal_stat.timespec_time-0', symObjAddr: 0x255C, symBinAddr: 0x100009860, symSize: 0x5C } + - { offset: 0x2CAE, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::init_std_files.new_std-0', symObjAddr: 0x25B8, symBinAddr: 0x1000098BC, symSize: 0xE8 } + - { offset: 0x2CE7, size: 0x8, addend: 0x0, symName: '_os::[file_posix.odin]::init_std_files.new_std-0', symObjAddr: 0x25B8, symBinAddr: 0x1000098BC, symSize: 0xE8 } + - { offset: 0x36F4, size: 0x8, addend: 0x0, symName: '_runtime::[default_temp_allocator_arena.odin]::safe_add', symObjAddr: 0x0, symBinAddr: 0x1000099A4, symSize: 0x58 } + - { offset: 0x37FE, size: 0x8, addend: 0x0, symName: '_runtime::[default_temp_allocator_arena.odin]::safe_add', symObjAddr: 0x0, symBinAddr: 0x1000099A4, symSize: 0x58 } + - { offset: 0x3806, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_alloc', symObjAddr: 0x58, symBinAddr: 0x1000099FC, symSize: 0x220 } + - { offset: 0x3845, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_alloc', symObjAddr: 0x58, symBinAddr: 0x1000099FC, symSize: 0x220 } + - { offset: 0x386E, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_alloc', symObjAddr: 0x58, symBinAddr: 0x1000099FC, symSize: 0x220 } + - { offset: 0x3876, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_dealloc', symObjAddr: 0x278, symBinAddr: 0x100009C1C, symSize: 0xE8 } + - { offset: 0x3905, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_dealloc', symObjAddr: 0x278, symBinAddr: 0x100009C1C, symSize: 0xE8 } + - { offset: 0x3960, size: 0x8, addend: 0x0, symName: '_runtime::memory_block_dealloc', symObjAddr: 0x278, symBinAddr: 0x100009C1C, symSize: 0xE8 } + - { offset: 0x3968, size: 0x8, addend: 0x0, symName: '_runtime::alloc_from_memory_block', symObjAddr: 0x360, symBinAddr: 0x100009D04, symSize: 0x228 } + - { offset: 0x39D0, size: 0x8, addend: 0x0, symName: '_runtime::alloc_from_memory_block', symObjAddr: 0x360, symBinAddr: 0x100009D04, symSize: 0x228 } + - { offset: 0x39D8, size: 0x8, addend: 0x0, symName: '_runtime::arena_alloc', symObjAddr: 0x588, symBinAddr: 0x100009F2C, symSize: 0x344 } + - { offset: 0x3A58, size: 0x8, addend: 0x0, symName: '_runtime::arena_alloc', symObjAddr: 0x588, symBinAddr: 0x100009F2C, symSize: 0x344 } + - { offset: 0x3AC5, size: 0x8, addend: 0x0, symName: '_runtime::arena_alloc', symObjAddr: 0x588, symBinAddr: 0x100009F2C, symSize: 0x344 } + - { offset: 0x3ACD, size: 0x8, addend: 0x0, symName: '_runtime::arena_free_last_memory_block', symObjAddr: 0x8CC, symBinAddr: 0x10000A270, symSize: 0x84 } + - { offset: 0x3B5C, size: 0x8, addend: 0x0, symName: '_runtime::arena_free_last_memory_block', symObjAddr: 0x8CC, symBinAddr: 0x10000A270, symSize: 0x84 } + - { offset: 0x3BC9, size: 0x8, addend: 0x0, symName: '_runtime::arena_free_last_memory_block', symObjAddr: 0x8CC, symBinAddr: 0x10000A270, symSize: 0x84 } + - { offset: 0x3BD1, size: 0x8, addend: 0x0, symName: '_runtime::arena_free_all', symObjAddr: 0x950, symBinAddr: 0x10000A2F4, symSize: 0xC4 } + - { offset: 0x3C27, size: 0x8, addend: 0x0, symName: '_runtime::arena_free_all', symObjAddr: 0x950, symBinAddr: 0x10000A2F4, symSize: 0xC4 } + - { offset: 0x3C2F, size: 0x8, addend: 0x0, symName: '_runtime::arena_destroy', symObjAddr: 0xA14, symBinAddr: 0x10000A3B8, symSize: 0x98 } + - { offset: 0x3C74, size: 0x8, addend: 0x0, symName: '_runtime::arena_destroy', symObjAddr: 0xA14, symBinAddr: 0x10000A3B8, symSize: 0x98 } + - { offset: 0x3C7C, size: 0x8, addend: 0x0, symName: '_runtime::arena_allocator_proc', symObjAddr: 0xAAC, symBinAddr: 0x10000A450, symSize: 0x6CC } + - { offset: 0x3CD2, size: 0x8, addend: 0x0, symName: '_runtime::arena_allocator_proc', symObjAddr: 0xAAC, symBinAddr: 0x10000A450, symSize: 0x6CC } + - { offset: 0x3CDA, size: 0x8, addend: 0x0, symName: '_runtime::alloc_from_memory_block.calc_alignment_offset-0', symObjAddr: 0x1178, symBinAddr: 0x10000AB1C, symSize: 0x8C } + - { offset: 0x3D96, size: 0x8, addend: 0x0, symName: '_runtime::alloc_from_memory_block.calc_alignment_offset-0', symObjAddr: 0x1178, symBinAddr: 0x10000AB1C, symSize: 0x8C } + - { offset: 0x3E6F, size: 0x8, addend: 0x0, symName: '_runtime::alloc_from_memory_block.calc_alignment_offset-0', symObjAddr: 0x1178, symBinAddr: 0x10000AB1C, symSize: 0x8C } + - { offset: 0x43F2, size: 0x8, addend: 0x0, symName: '_mem::[mem_posix.odin]::query_page_size_init', symObjAddr: 0x0, symBinAddr: 0x10000ABA8, symSize: 0xBC } + - { offset: 0x45C2, size: 0x8, addend: 0x0, symName: '_mem::[mem_posix.odin]::query_page_size_init', symObjAddr: 0x0, symBinAddr: 0x10000ABA8, symSize: 0xBC } + - { offset: 0x45CA, size: 0x8, addend: 0x0, symName: '_mem::zero', symObjAddr: 0xBC, symBinAddr: 0x10000AC64, symSize: 0x3C } + - { offset: 0x4603, size: 0x8, addend: 0x0, symName: '_mem::zero', symObjAddr: 0xBC, symBinAddr: 0x10000AC64, symSize: 0x3C } + - { offset: 0x460B, size: 0x8, addend: 0x0, symName: '_mem::check_zero_ptr', symObjAddr: 0xF8, symBinAddr: 0x10000ACA0, symSize: 0x2DC } + - { offset: 0x4643, size: 0x8, addend: 0x0, symName: '_mem::check_zero_ptr', symObjAddr: 0xF8, symBinAddr: 0x10000ACA0, symSize: 0x2DC } + - { offset: 0x464B, size: 0x8, addend: 0x0, symName: '_mem::align_backward_uintptr', symObjAddr: 0x3D4, symBinAddr: 0x10000AF7C, symSize: 0x7C } + - { offset: 0x46A0, size: 0x8, addend: 0x0, symName: '_mem::align_backward_uintptr', symObjAddr: 0x3D4, symBinAddr: 0x10000AF7C, symSize: 0x7C } + - { offset: 0x4757, size: 0x8, addend: 0x0, symName: '_mem::align_backward_uintptr', symObjAddr: 0x3D4, symBinAddr: 0x10000AF7C, symSize: 0x7C } + - { offset: 0x475F, size: 0x8, addend: 0x0, symName: '_mem::zero_slice:proc"contextless"(data:[]u8)->(:[]u8)', symObjAddr: 0x450, symBinAddr: 0x10000AFF8, symSize: 0x6C } + - { offset: 0x47AB, size: 0x8, addend: 0x0, symName: '_mem::zero_slice:proc"contextless"(data:[]u8)->(:[]u8)', symObjAddr: 0x450, symBinAddr: 0x10000AFF8, symSize: 0x6C } + - { offset: 0x4B89, size: 0x8, addend: 0x0, symName: '_strconv::parse_bool', symObjAddr: 0x0, symBinAddr: 0x10000B064, symSize: 0x410 } + - { offset: 0x4CA0, size: 0x8, addend: 0x0, symName: '_strconv::parse_bool', symObjAddr: 0x0, symBinAddr: 0x10000B064, symSize: 0x410 } + - { offset: 0x4CA8, size: 0x8, addend: 0x0, symName: '_strconv::is_integer_negative', symObjAddr: 0x410, symBinAddr: 0x10000B474, symSize: 0x19C } + - { offset: 0x4D02, size: 0x8, addend: 0x0, symName: '_strconv::is_integer_negative', symObjAddr: 0x410, symBinAddr: 0x10000B474, symSize: 0x19C } + - { offset: 0x4D0A, size: 0x8, addend: 0x0, symName: '_strconv::generic_ftoa', symObjAddr: 0x5AC, symBinAddr: 0x10000B610, symSize: 0x7C4 } + - { offset: 0x4DD5, size: 0x8, addend: 0x0, symName: '_strconv::generic_ftoa', symObjAddr: 0x5AC, symBinAddr: 0x10000B610, symSize: 0x7C4 } + - { offset: 0x4DDD, size: 0x8, addend: 0x0, symName: '_strconv::_digit_value', symObjAddr: 0xD70, symBinAddr: 0x10000BDD4, symSize: 0xD8 } + - { offset: 0x4E5B, size: 0x8, addend: 0x0, symName: '_strconv::_digit_value', symObjAddr: 0xD70, symBinAddr: 0x10000BDD4, symSize: 0xD8 } + - { offset: 0x4F38, size: 0x8, addend: 0x0, symName: '_strconv::_digit_value', symObjAddr: 0xD70, symBinAddr: 0x10000BDD4, symSize: 0xD8 } + - { offset: 0x4F40, size: 0x8, addend: 0x0, symName: '_strconv::write_bits', symObjAddr: 0xE48, symBinAddr: 0x10000BEAC, symSize: 0x788 } + - { offset: 0x4F71, size: 0x8, addend: 0x0, symName: '_strconv::write_bits', symObjAddr: 0xE48, symBinAddr: 0x10000BEAC, symSize: 0x788 } + - { offset: 0x4F9A, size: 0x8, addend: 0x0, symName: '_strconv::write_bits', symObjAddr: 0xE48, symBinAddr: 0x10000BEAC, symSize: 0x788 } + - { offset: 0x4FA2, size: 0x8, addend: 0x0, symName: '_strconv::is_integer_negative_128', symObjAddr: 0x15D0, symBinAddr: 0x10000C634, symSize: 0x360 } + - { offset: 0x503F, size: 0x8, addend: 0x0, symName: '_strconv::is_integer_negative_128', symObjAddr: 0x15D0, symBinAddr: 0x10000C634, symSize: 0x360 } + - { offset: 0x50C0, size: 0x8, addend: 0x0, symName: '_strconv::is_integer_negative_128', symObjAddr: 0x15D0, symBinAddr: 0x10000C634, symSize: 0x360 } + - { offset: 0x50C8, size: 0x8, addend: 0x0, symName: '_strconv::format_digits', symObjAddr: 0x1930, symBinAddr: 0x10000C994, symSize: 0xC10 } + - { offset: 0x51A3, size: 0x8, addend: 0x0, symName: '_strconv::format_digits', symObjAddr: 0x1930, symBinAddr: 0x10000C994, symSize: 0xC10 } + - { offset: 0x51AB, size: 0x8, addend: 0x0, symName: '_strconv::parse_i64_maybe_prefixed', symObjAddr: 0x2540, symBinAddr: 0x10000D5A4, symSize: 0x6E4 } + - { offset: 0x5238, size: 0x8, addend: 0x0, symName: '_strconv::parse_i64_maybe_prefixed', symObjAddr: 0x2540, symBinAddr: 0x10000D5A4, symSize: 0x6E4 } + - { offset: 0x5269, size: 0x8, addend: 0x0, symName: '_strconv::parse_i64_maybe_prefixed', symObjAddr: 0x2540, symBinAddr: 0x10000D5A4, symSize: 0x6E4 } + - { offset: 0x536F, size: 0x8, addend: 0x0, symName: '_strconv::parse_i64_maybe_prefixed', symObjAddr: 0x2540, symBinAddr: 0x10000D5A4, symSize: 0x6E4 } + - { offset: 0x5377, size: 0x8, addend: 0x0, symName: '_strconv::write_bits_128', symObjAddr: 0x2C24, symBinAddr: 0x10000DC88, symSize: 0x948 } + - { offset: 0x53E9, size: 0x8, addend: 0x0, symName: '_strconv::write_bits_128', symObjAddr: 0x2C24, symBinAddr: 0x10000DC88, symSize: 0x948 } + - { offset: 0x5478, size: 0x8, addend: 0x0, symName: '_strconv::write_bits_128', symObjAddr: 0x2C24, symBinAddr: 0x10000DC88, symSize: 0x948 } + - { offset: 0x5480, size: 0x8, addend: 0x0, symName: '_strconv::round_shortest', symObjAddr: 0x356C, symBinAddr: 0x10000E5D0, symSize: 0x5E4 } + - { offset: 0x551D, size: 0x8, addend: 0x0, symName: '_strconv::round_shortest', symObjAddr: 0x356C, symBinAddr: 0x10000E5D0, symSize: 0x5E4 } + - { offset: 0x55C4, size: 0x8, addend: 0x0, symName: '_strconv::round_shortest', symObjAddr: 0x356C, symBinAddr: 0x10000E5D0, symSize: 0x5E4 } + - { offset: 0x55CC, size: 0x8, addend: 0x0, symName: '_strconv::write_float', symObjAddr: 0x3B50, symBinAddr: 0x10000EBB4, symSize: 0xA4 } + - { offset: 0x575B, size: 0x8, addend: 0x0, symName: '_strconv::write_float', symObjAddr: 0x3B50, symBinAddr: 0x10000EBB4, symSize: 0xA4 } + - { offset: 0x5763, size: 0x8, addend: 0x0, symName: '_strconv::format_digits.to_bytes-0', symObjAddr: 0x3BF4, symBinAddr: 0x10000EC58, symSize: 0x70 } + - { offset: 0x57E1, size: 0x8, addend: 0x0, symName: '_strconv::format_digits.to_bytes-0', symObjAddr: 0x3BF4, symBinAddr: 0x10000EC58, symSize: 0x70 } + - { offset: 0x57E9, size: 0x8, addend: 0x0, symName: '_strconv::format_digits.add_bytes-1', symObjAddr: 0x3C64, symBinAddr: 0x10000ECC8, symSize: 0xF0 } + - { offset: 0x5814, size: 0x8, addend: 0x0, symName: '_strconv::format_digits.add_bytes-1', symObjAddr: 0x3C64, symBinAddr: 0x10000ECC8, symSize: 0xF0 } + - { offset: 0x5DCF, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::art_rect', symObjAddr: 0x0, symBinAddr: 0x10000EDB8, symSize: 0x98 } + - { offset: 0x6013, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::art_rect', symObjAddr: 0x0, symBinAddr: 0x10000EDB8, symSize: 0x98 } + - { offset: 0x601B, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::new_art_texture', symObjAddr: 0x98, symBinAddr: 0x10000EE50, symSize: 0x1AC } + - { offset: 0x6054, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::new_art_texture', symObjAddr: 0x98, symBinAddr: 0x10000EE50, symSize: 0x1AC } + - { offset: 0x605C, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_frame', symObjAddr: 0x244, symBinAddr: 0x10000EFFC, symSize: 0x180 } + - { offset: 0x609E, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_frame', symObjAddr: 0x244, symBinAddr: 0x10000EFFC, symSize: 0x180 } + - { offset: 0x60B9, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_frame', symObjAddr: 0x244, symBinAddr: 0x10000EFFC, symSize: 0x180 } + - { offset: 0x60C1, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_japan_back', symObjAddr: 0x3C4, symBinAddr: 0x10000F17C, symSize: 0x130 } + - { offset: 0x6107, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_japan_back', symObjAddr: 0x3C4, symBinAddr: 0x10000F17C, symSize: 0x130 } + - { offset: 0x610F, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_trigram', symObjAddr: 0x4F4, symBinAddr: 0x10000F2AC, symSize: 0x468 } + - { offset: 0x6158, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_trigram', symObjAddr: 0x4F4, symBinAddr: 0x10000F2AC, symSize: 0x468 } + - { offset: 0x6160, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_korea_back', symObjAddr: 0x95C, symBinAddr: 0x10000F714, symSize: 0x460 } + - { offset: 0x62E0, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_korea_back', symObjAddr: 0x95C, symBinAddr: 0x10000F714, symSize: 0x460 } + - { offset: 0x62E8, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_thailand_back', symObjAddr: 0xDBC, symBinAddr: 0x10000FB74, symSize: 0x2C8 } + - { offset: 0x6392, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::draw_thailand_back', symObjAddr: 0xDBC, symBinAddr: 0x10000FB74, symSize: 0x2C8 } + - { offset: 0x639A, size: 0x8, addend: 0x0, symName: '_card::load_art', symObjAddr: 0x1084, symBinAddr: 0x10000FE3C, symSize: 0x308 } + - { offset: 0x6436, size: 0x8, addend: 0x0, symName: '_card::load_art', symObjAddr: 0x1084, symBinAddr: 0x10000FE3C, symSize: 0x308 } + - { offset: 0x643E, size: 0x8, addend: 0x0, symName: '_card::unload_art', symObjAddr: 0x138C, symBinAddr: 0x100010144, symSize: 0x120 } + - { offset: 0x649F, size: 0x8, addend: 0x0, symName: '_card::unload_art', symObjAddr: 0x138C, symBinAddr: 0x100010144, symSize: 0x120 } + - { offset: 0x64A7, size: 0x8, addend: 0x0, symName: '_card::get_back_art', symObjAddr: 0x14AC, symBinAddr: 0x100010264, symSize: 0x88 } + - { offset: 0x64E1, size: 0x8, addend: 0x0, symName: '_card::get_back_art', symObjAddr: 0x14AC, symBinAddr: 0x100010264, symSize: 0x88 } + - { offset: 0x64E9, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::fit_size', symObjAddr: 0x1534, symBinAddr: 0x1000102EC, symSize: 0xAC } + - { offset: 0x6513, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::fit_size', symObjAddr: 0x1534, symBinAddr: 0x1000102EC, symSize: 0xAC } + - { offset: 0x651B, size: 0x8, addend: 0x0, symName: '_card::build_face', symObjAddr: 0x15E0, symBinAddr: 0x100010398, symSize: 0x674 } + - { offset: 0x657A, size: 0x8, addend: 0x0, symName: '_card::build_face', symObjAddr: 0x15E0, symBinAddr: 0x100010398, symSize: 0x674 } + - { offset: 0x65A3, size: 0x8, addend: 0x0, symName: '_card::build_face', symObjAddr: 0x15E0, symBinAddr: 0x100010398, symSize: 0x674 } + - { offset: 0x65AB, size: 0x8, addend: 0x0, symName: '_card::unload_face', symObjAddr: 0x1C54, symBinAddr: 0x100010A0C, symSize: 0xC0 } + - { offset: 0x6634, size: 0x8, addend: 0x0, symName: '_card::unload_face', symObjAddr: 0x1C54, symBinAddr: 0x100010A0C, symSize: 0xC0 } + - { offset: 0x663C, size: 0x8, addend: 0x0, symName: '_card::is_animating', symObjAddr: 0x1D14, symBinAddr: 0x100010ACC, symSize: 0x4C } + - { offset: 0x6663, size: 0x8, addend: 0x0, symName: '_card::is_animating', symObjAddr: 0x1D14, symBinAddr: 0x100010ACC, symSize: 0x4C } + - { offset: 0x666B, size: 0x8, addend: 0x0, symName: '_card::update', symObjAddr: 0x1D60, symBinAddr: 0x100010B18, symSize: 0x118 } + - { offset: 0x669C, size: 0x8, addend: 0x0, symName: '_card::update', symObjAddr: 0x1D60, symBinAddr: 0x100010B18, symSize: 0x118 } + - { offset: 0x66B6, size: 0x8, addend: 0x0, symName: '_card::update', symObjAddr: 0x1D60, symBinAddr: 0x100010B18, symSize: 0x118 } + - { offset: 0x66BE, size: 0x8, addend: 0x0, symName: '_card::start_pulse', symObjAddr: 0x1E78, symBinAddr: 0x100010C30, symSize: 0x2C } + - { offset: 0x6722, size: 0x8, addend: 0x0, symName: '_card::start_pulse', symObjAddr: 0x1E78, symBinAddr: 0x100010C30, symSize: 0x2C } + - { offset: 0x672A, size: 0x8, addend: 0x0, symName: '_card::is_hovered', symObjAddr: 0x1EA4, symBinAddr: 0x100010C5C, symSize: 0x60 } + - { offset: 0x6750, size: 0x8, addend: 0x0, symName: '_card::is_hovered', symObjAddr: 0x1EA4, symBinAddr: 0x100010C5C, symSize: 0x60 } + - { offset: 0x6758, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::smoothstep', symObjAddr: 0x1F04, symBinAddr: 0x100010CBC, symSize: 0x34 } + - { offset: 0x6782, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::smoothstep', symObjAddr: 0x1F04, symBinAddr: 0x100010CBC, symSize: 0x34 } + - { offset: 0x678A, size: 0x8, addend: 0x0, symName: '_card::draw', symObjAddr: 0x1F38, symBinAddr: 0x100010CF0, symSize: 0x868 } + - { offset: 0x67B4, size: 0x8, addend: 0x0, symName: '_card::draw', symObjAddr: 0x1F38, symBinAddr: 0x100010CF0, symSize: 0x868 } + - { offset: 0x6F67, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x100011558, symSize: 0xF8 } + - { offset: 0x7062, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x100011558, symSize: 0xF8 } + - { offset: 0x7487, size: 0x8, addend: 0x0, symName: '_raylib::TextFormat', symObjAddr: 0x0, symBinAddr: 0x100011650, symSize: 0x21C } + - { offset: 0x762B, size: 0x8, addend: 0x0, symName: '_raylib::TextFormat', symObjAddr: 0x0, symBinAddr: 0x100011650, symSize: 0x21C } + - { offset: 0x7AB1, size: 0x8, addend: 0x0, symName: '_runtime::nil_allocator_proc', symObjAddr: 0x0, symBinAddr: 0x10001186C, symSize: 0x1A0 } + - { offset: 0x7BAC, size: 0x8, addend: 0x0, symName: '_runtime::nil_allocator_proc', symObjAddr: 0x0, symBinAddr: 0x10001186C, symSize: 0x1A0 } + - { offset: 0x7BB4, size: 0x8, addend: 0x0, symName: '_runtime::nil_allocator', symObjAddr: 0x1A0, symBinAddr: 0x100011A0C, symSize: 0x28 } + - { offset: 0x7C2A, size: 0x8, addend: 0x0, symName: '_runtime::nil_allocator', symObjAddr: 0x1A0, symBinAddr: 0x100011A0C, symSize: 0x28 } + - { offset: 0x7FE8, size: 0x8, addend: 0x0, symName: '_strings::[builder.odin]::_builder_stream_proc', symObjAddr: 0x0, symBinAddr: 0x100011A34, symSize: 0x224 } + - { offset: 0x8202, size: 0x8, addend: 0x0, symName: '_strings::[builder.odin]::_builder_stream_proc', symObjAddr: 0x0, symBinAddr: 0x100011A34, symSize: 0x224 } + - { offset: 0x820A, size: 0x8, addend: 0x0, symName: '_strings::to_stream', symObjAddr: 0x224, symBinAddr: 0x100011C58, symSize: 0x64 } + - { offset: 0x82A9, size: 0x8, addend: 0x0, symName: '_strings::to_stream', symObjAddr: 0x224, symBinAddr: 0x100011C58, symSize: 0x64 } + - { offset: 0x82C4, size: 0x8, addend: 0x0, symName: '_strings::to_stream', symObjAddr: 0x224, symBinAddr: 0x100011C58, symSize: 0x64 } + - { offset: 0x82CC, size: 0x8, addend: 0x0, symName: '_strings::to_writer', symObjAddr: 0x288, symBinAddr: 0x100011CBC, symSize: 0x98 } + - { offset: 0x8316, size: 0x8, addend: 0x0, symName: '_strings::to_writer', symObjAddr: 0x288, symBinAddr: 0x100011CBC, symSize: 0x98 } + - { offset: 0x831E, size: 0x8, addend: 0x0, symName: '_strings::builder_destroy', symObjAddr: 0x320, symBinAddr: 0x100011D54, symSize: 0x50 } + - { offset: 0x8369, size: 0x8, addend: 0x0, symName: '_strings::builder_destroy', symObjAddr: 0x320, symBinAddr: 0x100011D54, symSize: 0x50 } + - { offset: 0x8371, size: 0x8, addend: 0x0, symName: '_strings::builder_from_bytes', symObjAddr: 0x370, symBinAddr: 0x100011DA4, symSize: 0x110 } + - { offset: 0x83A7, size: 0x8, addend: 0x0, symName: '_strings::builder_from_bytes', symObjAddr: 0x370, symBinAddr: 0x100011DA4, symSize: 0x110 } + - { offset: 0x83AF, size: 0x8, addend: 0x0, symName: '_strings::to_string', symObjAddr: 0x480, symBinAddr: 0x100011EB4, symSize: 0x54 } + - { offset: 0x83ED, size: 0x8, addend: 0x0, symName: '_strings::to_string', symObjAddr: 0x480, symBinAddr: 0x100011EB4, symSize: 0x54 } + - { offset: 0x83F5, size: 0x8, addend: 0x0, symName: '_strings::write_bytes', symObjAddr: 0x4D4, symBinAddr: 0x100011F08, symSize: 0xA0 } + - { offset: 0x8443, size: 0x8, addend: 0x0, symName: '_strings::write_bytes', symObjAddr: 0x4D4, symBinAddr: 0x100011F08, symSize: 0xA0 } + - { offset: 0x844B, size: 0x8, addend: 0x0, symName: '_strings::[strings.odin]::_split_iterator', symObjAddr: 0x574, symBinAddr: 0x100011FA8, symSize: 0x1D8 } + - { offset: 0x84C1, size: 0x8, addend: 0x0, symName: '_strings::[strings.odin]::_split_iterator', symObjAddr: 0x574, symBinAddr: 0x100011FA8, symSize: 0x1D8 } + - { offset: 0x84ED, size: 0x8, addend: 0x0, symName: '_strings::[strings.odin]::_split_iterator', symObjAddr: 0x574, symBinAddr: 0x100011FA8, symSize: 0x1D8 } + - { offset: 0x84F5, size: 0x8, addend: 0x0, symName: '_strings::split_iterator', symObjAddr: 0x74C, symBinAddr: 0x100012180, symSize: 0xA4 } + - { offset: 0x857C, size: 0x8, addend: 0x0, symName: '_strings::split_iterator', symObjAddr: 0x74C, symBinAddr: 0x100012180, symSize: 0xA4 } + - { offset: 0x85BB, size: 0x8, addend: 0x0, symName: '_strings::split_iterator', symObjAddr: 0x74C, symBinAddr: 0x100012180, symSize: 0xA4 } + - { offset: 0x85C3, size: 0x8, addend: 0x0, symName: '_strings::index_byte', symObjAddr: 0x7F0, symBinAddr: 0x100012224, symSize: 0x60 } + - { offset: 0x8633, size: 0x8, addend: 0x0, symName: '_strings::index_byte', symObjAddr: 0x7F0, symBinAddr: 0x100012224, symSize: 0x60 } + - { offset: 0x863B, size: 0x8, addend: 0x0, symName: '_strings::index', symObjAddr: 0x850, symBinAddr: 0x100012284, symSize: 0x3D0 } + - { offset: 0x8687, size: 0x8, addend: 0x0, symName: '_strings::index', symObjAddr: 0x850, symBinAddr: 0x100012284, symSize: 0x3D0 } + - { offset: 0x868F, size: 0x8, addend: 0x0, symName: '_strings::is_space', symObjAddr: 0xC20, symBinAddr: 0x100012654, symSize: 0x13C } + - { offset: 0x86E4, size: 0x8, addend: 0x0, symName: '_strings::is_space', symObjAddr: 0xC20, symBinAddr: 0x100012654, symSize: 0x13C } + - { offset: 0x8779, size: 0x8, addend: 0x0, symName: '_strings::is_space', symObjAddr: 0xC20, symBinAddr: 0x100012654, symSize: 0x13C } + - { offset: 0x8781, size: 0x8, addend: 0x0, symName: '_strings::index_proc', symObjAddr: 0xD5C, symBinAddr: 0x100012790, symSize: 0x12C } + - { offset: 0x87BD, size: 0x8, addend: 0x0, symName: '_strings::index_proc', symObjAddr: 0xD5C, symBinAddr: 0x100012790, symSize: 0x12C } + - { offset: 0x87C5, size: 0x8, addend: 0x0, symName: '_strings::last_index_proc', symObjAddr: 0xE88, symBinAddr: 0x1000128BC, symSize: 0x144 } + - { offset: 0x8868, size: 0x8, addend: 0x0, symName: '_strings::last_index_proc', symObjAddr: 0xE88, symBinAddr: 0x1000128BC, symSize: 0x144 } + - { offset: 0x8870, size: 0x8, addend: 0x0, symName: '_strings::trim_left_proc', symObjAddr: 0xFCC, symBinAddr: 0x100012A00, symSize: 0x114 } + - { offset: 0x8934, size: 0x8, addend: 0x0, symName: '_strings::trim_left_proc', symObjAddr: 0xFCC, symBinAddr: 0x100012A00, symSize: 0x114 } + - { offset: 0x893C, size: 0x8, addend: 0x0, symName: '_strings::trim_right_proc', symObjAddr: 0x10E0, symBinAddr: 0x100012B14, symSize: 0x110 } + - { offset: 0x89A2, size: 0x8, addend: 0x0, symName: '_strings::trim_right_proc', symObjAddr: 0x10E0, symBinAddr: 0x100012B14, symSize: 0x110 } + - { offset: 0x89BE, size: 0x8, addend: 0x0, symName: '_strings::trim_right_proc', symObjAddr: 0x10E0, symBinAddr: 0x100012B14, symSize: 0x110 } + - { offset: 0x89C6, size: 0x8, addend: 0x0, symName: '_strings::trim_left_space', symObjAddr: 0x11F0, symBinAddr: 0x100012C24, symSize: 0x90 } + - { offset: 0x8A2C, size: 0x8, addend: 0x0, symName: '_strings::trim_left_space', symObjAddr: 0x11F0, symBinAddr: 0x100012C24, symSize: 0x90 } + - { offset: 0x8A6A, size: 0x8, addend: 0x0, symName: '_strings::trim_left_space', symObjAddr: 0x11F0, symBinAddr: 0x100012C24, symSize: 0x90 } + - { offset: 0x8A72, size: 0x8, addend: 0x0, symName: '_strings::trim_right_space', symObjAddr: 0x1280, symBinAddr: 0x100012CB4, symSize: 0x90 } + - { offset: 0x8AC1, size: 0x8, addend: 0x0, symName: '_strings::trim_right_space', symObjAddr: 0x1280, symBinAddr: 0x100012CB4, symSize: 0x90 } + - { offset: 0x8AC9, size: 0x8, addend: 0x0, symName: '_strings::trim_space', symObjAddr: 0x1310, symBinAddr: 0x100012D44, symSize: 0xB0 } + - { offset: 0x8B18, size: 0x8, addend: 0x0, symName: '_strings::trim_space', symObjAddr: 0x1310, symBinAddr: 0x100012D44, symSize: 0xB0 } + - { offset: 0x8B20, size: 0x8, addend: 0x0, symName: '_strings::partition', symObjAddr: 0x13C0, symBinAddr: 0x100012DF4, symSize: 0x1DC } + - { offset: 0x8B6F, size: 0x8, addend: 0x0, symName: '_strings::partition', symObjAddr: 0x13C0, symBinAddr: 0x100012DF4, symSize: 0x1DC } + - { offset: 0x8B77, size: 0x8, addend: 0x0, symName: '_strings::index.hash_str_rabin_karp-0', symObjAddr: 0x159C, symBinAddr: 0x100012FD0, symSize: 0x130 } + - { offset: 0x8BFF, size: 0x8, addend: 0x0, symName: '_strings::index.hash_str_rabin_karp-0', symObjAddr: 0x159C, symBinAddr: 0x100012FD0, symSize: 0x130 } + - { offset: 0x8C1B, size: 0x8, addend: 0x0, symName: '_strings::index.hash_str_rabin_karp-0', symObjAddr: 0x159C, symBinAddr: 0x100012FD0, symSize: 0x130 } + - { offset: 0x9184, size: 0x8, addend: 0x0, symName: '_runtime::[os_specific_darwin.odin]::_stderr_write', symObjAddr: 0x0, symBinAddr: 0x100013100, symSize: 0x94 } + - { offset: 0x91B1, size: 0x8, addend: 0x0, symName: '_runtime::[os_specific_darwin.odin]::_stderr_write', symObjAddr: 0x0, symBinAddr: 0x100013100, symSize: 0x94 } + - { offset: 0x91B9, size: 0x8, addend: 0x0, symName: '_runtime::[os_specific_darwin.odin]::_rand_bytes', symObjAddr: 0x94, symBinAddr: 0x100013194, symSize: 0x3C } + - { offset: 0x9205, size: 0x8, addend: 0x0, symName: '_runtime::[os_specific_darwin.odin]::_rand_bytes', symObjAddr: 0x94, symBinAddr: 0x100013194, symSize: 0x3C } + - { offset: 0x92A8, size: 0x8, addend: 0x0, symName: '_decks::decks_for', symObjAddr: 0x0, symBinAddr: 0x1000131D0, symSize: 0xF0 } + - { offset: 0x936C, size: 0x8, addend: 0x0, symName: '_decks::decks_for', symObjAddr: 0x0, symBinAddr: 0x1000131D0, symSize: 0xF0 } + - { offset: 0x9374, size: 0x8, addend: 0x0, symName: '_decks::language_of', symObjAddr: 0xF0, symBinAddr: 0x1000132C0, symSize: 0xDC } + - { offset: 0x939F, size: 0x8, addend: 0x0, symName: '_decks::language_of', symObjAddr: 0xF0, symBinAddr: 0x1000132C0, symSize: 0xDC } + - { offset: 0x93A7, size: 0x8, addend: 0x0, symName: '_decks::entries', symObjAddr: 0x1CC, symBinAddr: 0x10001339C, symSize: 0x134 } + - { offset: 0x93D2, size: 0x8, addend: 0x0, symName: '_decks::entries', symObjAddr: 0x1CC, symBinAddr: 0x10001339C, symSize: 0x134 } + - { offset: 0x95A4, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator', symObjAddr: 0x0, symBinAddr: 0x1000134D0, symSize: 0x28 } + - { offset: 0x969F, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator', symObjAddr: 0x0, symBinAddr: 0x1000134D0, symSize: 0x28 } + - { offset: 0x96A7, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc', symObjAddr: 0x28, symBinAddr: 0x1000134F8, symSize: 0x254 } + - { offset: 0x96C2, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc', symObjAddr: 0x28, symBinAddr: 0x1000134F8, symSize: 0x254 } + - { offset: 0x96CA, size: 0x8, addend: 0x0, symName: '_runtime::heap_alloc', symObjAddr: 0x27C, symBinAddr: 0x10001374C, symSize: 0x3C } + - { offset: 0x9781, size: 0x8, addend: 0x0, symName: '_runtime::heap_alloc', symObjAddr: 0x27C, symBinAddr: 0x10001374C, symSize: 0x3C } + - { offset: 0x9789, size: 0x8, addend: 0x0, symName: '_runtime::heap_resize', symObjAddr: 0x2B8, symBinAddr: 0x100013788, symSize: 0x38 } + - { offset: 0x97C1, size: 0x8, addend: 0x0, symName: '_runtime::heap_resize', symObjAddr: 0x2B8, symBinAddr: 0x100013788, symSize: 0x38 } + - { offset: 0x97C9, size: 0x8, addend: 0x0, symName: '_runtime::heap_free', symObjAddr: 0x2F0, symBinAddr: 0x1000137C0, symSize: 0x2C } + - { offset: 0x9801, size: 0x8, addend: 0x0, symName: '_runtime::heap_free', symObjAddr: 0x2F0, symBinAddr: 0x1000137C0, symSize: 0x2C } + - { offset: 0x9809, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_alloc-0', symObjAddr: 0x31C, symBinAddr: 0x1000137EC, symSize: 0x208 } + - { offset: 0x982F, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_alloc-0', symObjAddr: 0x31C, symBinAddr: 0x1000137EC, symSize: 0x208 } + - { offset: 0x9837, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_free-1', symObjAddr: 0x524, symBinAddr: 0x1000139F4, symSize: 0x48 } + - { offset: 0x98B5, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_free-1', symObjAddr: 0x524, symBinAddr: 0x1000139F4, symSize: 0x48 } + - { offset: 0x9952, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_free-1', symObjAddr: 0x524, symBinAddr: 0x1000139F4, symSize: 0x48 } + - { offset: 0x995A, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_resize-2', symObjAddr: 0x56C, symBinAddr: 0x100013A3C, symSize: 0x21C } + - { offset: 0x9980, size: 0x8, addend: 0x0, symName: '_runtime::heap_allocator_proc.aligned_resize-2', symObjAddr: 0x56C, symBinAddr: 0x100013A3C, symSize: 0x21C } + - { offset: 0x9E90, size: 0x8, addend: 0x0, symName: '_fmt::bprintf', symObjAddr: 0x0, symBinAddr: 0x100013C58, symSize: 0x174 } + - { offset: 0x9E98, size: 0x8, addend: 0x0, symName: '___$hasher$$typeid', symObjAddr: 0x133B8, symBinAddr: 0x100027010, symSize: 0x34 } + - { offset: 0xA1BB, size: 0x8, addend: 0x0, symName: '_fmt::bprintf', symObjAddr: 0x0, symBinAddr: 0x100013C58, symSize: 0x174 } + - { offset: 0xA1C3, size: 0x8, addend: 0x0, symName: '_fmt::sbprintf', symObjAddr: 0x174, symBinAddr: 0x100013DCC, symSize: 0x138 } + - { offset: 0xA239, size: 0x8, addend: 0x0, symName: '_fmt::sbprintf', symObjAddr: 0x174, symBinAddr: 0x100013DCC, symSize: 0x138 } + - { offset: 0xA255, size: 0x8, addend: 0x0, symName: '_fmt::sbprintf', symObjAddr: 0x174, symBinAddr: 0x100013DCC, symSize: 0x138 } + - { offset: 0xA25D, size: 0x8, addend: 0x0, symName: '_fmt::wprintf', symObjAddr: 0x2AC, symBinAddr: 0x100013F04, symSize: 0x13FC } + - { offset: 0xA2CC, size: 0x8, addend: 0x0, symName: '_fmt::wprintf', symObjAddr: 0x2AC, symBinAddr: 0x100013F04, symSize: 0x13FC } + - { offset: 0xA2D4, size: 0x8, addend: 0x0, symName: '_fmt::_parse_int', symObjAddr: 0x16A8, symBinAddr: 0x100015300, symSize: 0x14C } + - { offset: 0xA36A, size: 0x8, addend: 0x0, symName: '_fmt::_parse_int', symObjAddr: 0x16A8, symBinAddr: 0x100015300, symSize: 0x14C } + - { offset: 0xA54A, size: 0x8, addend: 0x0, symName: '_fmt::_parse_int', symObjAddr: 0x16A8, symBinAddr: 0x100015300, symSize: 0x14C } + - { offset: 0xA552, size: 0x8, addend: 0x0, symName: '_fmt::_arg_number', symObjAddr: 0x17F4, symBinAddr: 0x10001544C, symSize: 0x240 } + - { offset: 0xA5F7, size: 0x8, addend: 0x0, symName: '_fmt::_arg_number', symObjAddr: 0x17F4, symBinAddr: 0x10001544C, symSize: 0x240 } + - { offset: 0xA5FF, size: 0x8, addend: 0x0, symName: '_fmt::int_from_arg', symObjAddr: 0x1A34, symBinAddr: 0x10001568C, symSize: 0x124 } + - { offset: 0xA698, size: 0x8, addend: 0x0, symName: '_fmt::int_from_arg', symObjAddr: 0x1A34, symBinAddr: 0x10001568C, symSize: 0x124 } + - { offset: 0xA6C5, size: 0x8, addend: 0x0, symName: '_fmt::int_from_arg', symObjAddr: 0x1A34, symBinAddr: 0x10001568C, symSize: 0x124 } + - { offset: 0xA6CD, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bad_verb', symObjAddr: 0x1B58, symBinAddr: 0x1000157B0, symSize: 0x270 } + - { offset: 0xA722, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bad_verb', symObjAddr: 0x1B58, symBinAddr: 0x1000157B0, symSize: 0x270 } + - { offset: 0xA760, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bad_verb', symObjAddr: 0x1B58, symBinAddr: 0x1000157B0, symSize: 0x270 } + - { offset: 0xA768, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bool', symObjAddr: 0x1DC8, symBinAddr: 0x100015A20, symSize: 0xDC } + - { offset: 0xA7F8, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bool', symObjAddr: 0x1DC8, symBinAddr: 0x100015A20, symSize: 0xDC } + - { offset: 0xA800, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_padding', symObjAddr: 0x1EA4, symBinAddr: 0x100015AFC, symSize: 0xEC } + - { offset: 0xA85A, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_padding', symObjAddr: 0x1EA4, symBinAddr: 0x100015AFC, symSize: 0xEC } + - { offset: 0xA862, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_int', symObjAddr: 0x1F90, symBinAddr: 0x100015BE8, symSize: 0x6BC } + - { offset: 0xA8F0, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_int', symObjAddr: 0x1F90, symBinAddr: 0x100015BE8, symSize: 0x6BC } + - { offset: 0xA8F8, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_int_128', symObjAddr: 0x264C, symBinAddr: 0x1000162A4, symSize: 0x790 } + - { offset: 0xAA2F, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_int_128', symObjAddr: 0x264C, symBinAddr: 0x1000162A4, symSize: 0x790 } + - { offset: 0xAA37, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_memory', symObjAddr: 0x2DDC, symBinAddr: 0x100016A34, symSize: 0x4C0 } + - { offset: 0xAB91, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_memory', symObjAddr: 0x2DDC, symBinAddr: 0x100016A34, symSize: 0x4C0 } + - { offset: 0xAB99, size: 0x8, addend: 0x0, symName: '_fmt::fmt_rune', symObjAddr: 0x329C, symBinAddr: 0x100016EF4, symSize: 0x13C } + - { offset: 0xACE2, size: 0x8, addend: 0x0, symName: '_fmt::fmt_rune', symObjAddr: 0x329C, symBinAddr: 0x100016EF4, symSize: 0x13C } + - { offset: 0xACEA, size: 0x8, addend: 0x0, symName: '_fmt::fmt_int', symObjAddr: 0x33D8, symBinAddr: 0x100017030, symSize: 0x444 } + - { offset: 0xAD44, size: 0x8, addend: 0x0, symName: '_fmt::fmt_int', symObjAddr: 0x33D8, symBinAddr: 0x100017030, symSize: 0x444 } + - { offset: 0xAD4C, size: 0x8, addend: 0x0, symName: '_fmt::fmt_int_128', symObjAddr: 0x381C, symBinAddr: 0x100017474, symSize: 0x42C } + - { offset: 0xADE9, size: 0x8, addend: 0x0, symName: '_fmt::fmt_int_128', symObjAddr: 0x381C, symBinAddr: 0x100017474, symSize: 0x42C } + - { offset: 0xADF1, size: 0x8, addend: 0x0, symName: '_fmt::_pad', symObjAddr: 0x3C48, symBinAddr: 0x1000178A0, symSize: 0x3CC } + - { offset: 0xAE8F, size: 0x8, addend: 0x0, symName: '_fmt::_pad', symObjAddr: 0x3C48, symBinAddr: 0x1000178A0, symSize: 0x3CC } + - { offset: 0xAE97, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_float_as', symObjAddr: 0x4014, symBinAddr: 0x100017C6C, symSize: 0x234 } + - { offset: 0xAF05, size: 0x8, addend: 0x0, symName: '_fmt::_fmt_float_as', symObjAddr: 0x4014, symBinAddr: 0x100017C6C, symSize: 0x234 } + - { offset: 0xAF0D, size: 0x8, addend: 0x0, symName: '_fmt::fmt_float', symObjAddr: 0x4248, symBinAddr: 0x100017EA0, symSize: 0x394 } + - { offset: 0xAFDD, size: 0x8, addend: 0x0, symName: '_fmt::fmt_float', symObjAddr: 0x4248, symBinAddr: 0x100017EA0, symSize: 0x394 } + - { offset: 0xAFE5, size: 0x8, addend: 0x0, symName: '_fmt::fmt_string', symObjAddr: 0x45DC, symBinAddr: 0x100018234, symSize: 0x5CC } + - { offset: 0xB084, size: 0x8, addend: 0x0, symName: '_fmt::fmt_string', symObjAddr: 0x45DC, symBinAddr: 0x100018234, symSize: 0x5CC } + - { offset: 0xB08C, size: 0x8, addend: 0x0, symName: '_fmt::fmt_cstring', symObjAddr: 0x4BA8, symBinAddr: 0x100018800, symSize: 0x7C } + - { offset: 0xB1B7, size: 0x8, addend: 0x0, symName: '_fmt::fmt_cstring', symObjAddr: 0x4BA8, symBinAddr: 0x100018800, symSize: 0x7C } + - { offset: 0xB1BF, size: 0x8, addend: 0x0, symName: '_fmt::fmt_string16', symObjAddr: 0x4C24, symBinAddr: 0x10001887C, symSize: 0x5C8 } + - { offset: 0xB219, size: 0x8, addend: 0x0, symName: '_fmt::fmt_string16', symObjAddr: 0x4C24, symBinAddr: 0x10001887C, symSize: 0x5C8 } + - { offset: 0xB221, size: 0x8, addend: 0x0, symName: '_fmt::fmt_cstring16', symObjAddr: 0x51EC, symBinAddr: 0x100018E44, symSize: 0x7C } + - { offset: 0xB34C, size: 0x8, addend: 0x0, symName: '_fmt::fmt_cstring16', symObjAddr: 0x51EC, symBinAddr: 0x100018E44, symSize: 0x7C } + - { offset: 0xB354, size: 0x8, addend: 0x0, symName: '_fmt::fmt_pointer', symObjAddr: 0x5268, symBinAddr: 0x100018EC0, symSize: 0x360 } + - { offset: 0xB3AE, size: 0x8, addend: 0x0, symName: '_fmt::fmt_pointer', symObjAddr: 0x5268, symBinAddr: 0x100018EC0, symSize: 0x360 } + - { offset: 0xB3B6, size: 0x8, addend: 0x0, symName: '_fmt::fmt_soa_pointer', symObjAddr: 0x55C8, symBinAddr: 0x100019220, symSize: 0x1E0 } + - { offset: 0xB433, size: 0x8, addend: 0x0, symName: '_fmt::fmt_soa_pointer', symObjAddr: 0x55C8, symBinAddr: 0x100019220, symSize: 0x1E0 } + - { offset: 0xB43B, size: 0x8, addend: 0x0, symName: '_fmt::enum_value_to_string', symObjAddr: 0x57A8, symBinAddr: 0x100019400, symSize: 0x7C } + - { offset: 0xB495, size: 0x8, addend: 0x0, symName: '_fmt::enum_value_to_string', symObjAddr: 0x57A8, symBinAddr: 0x100019400, symSize: 0x7C } + - { offset: 0xB49D, size: 0x8, addend: 0x0, symName: '_fmt::fmt_enum', symObjAddr: 0x5824, symBinAddr: 0x10001947C, symSize: 0x558 } + - { offset: 0xB4DB, size: 0x8, addend: 0x0, symName: '_fmt::fmt_enum', symObjAddr: 0x5824, symBinAddr: 0x10001947C, symSize: 0x558 } + - { offset: 0xB4E3, size: 0x8, addend: 0x0, symName: '_fmt::stored_enum_value_to_string', symObjAddr: 0x5D7C, symBinAddr: 0x1000199D4, symSize: 0x2B8 } + - { offset: 0xB5C8, size: 0x8, addend: 0x0, symName: '_fmt::stored_enum_value_to_string', symObjAddr: 0x5D7C, symBinAddr: 0x1000199D4, symSize: 0x2B8 } + - { offset: 0xB5D0, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_set', symObjAddr: 0x6034, symBinAddr: 0x100019C8C, symSize: 0xBA0 } + - { offset: 0xB636, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_set', symObjAddr: 0x6034, symBinAddr: 0x100019C8C, symSize: 0xBA0 } + - { offset: 0xB6CB, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_set', symObjAddr: 0x6034, symBinAddr: 0x100019C8C, symSize: 0xBA0 } + - { offset: 0xB6D3, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_indent', symObjAddr: 0x6BD4, symBinAddr: 0x10001A82C, symSize: 0x9C } + - { offset: 0xB988, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_indent', symObjAddr: 0x6BD4, symBinAddr: 0x10001A82C, symSize: 0x9C } + - { offset: 0xB990, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_array', symObjAddr: 0x6C70, symBinAddr: 0x10001A8C8, symSize: 0x400 } + - { offset: 0xB9C9, size: 0x8, addend: 0x0, symName: '_fmt::fmt_write_array', symObjAddr: 0x6C70, symBinAddr: 0x10001A8C8, symSize: 0x400 } + - { offset: 0xB9D1, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::handle_tag', symObjAddr: 0x7070, symBinAddr: 0x10001ACC8, symSize: 0x804 } + - { offset: 0xBB0A, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::handle_tag', symObjAddr: 0x7070, symBinAddr: 0x10001ACC8, symSize: 0x804 } + - { offset: 0xBB12, size: 0x8, addend: 0x0, symName: '_fmt::__handle_raw_union_tag', symObjAddr: 0x7874, symBinAddr: 0x10001B4CC, symSize: 0x1464 } + - { offset: 0xBBD8, size: 0x8, addend: 0x0, symName: '_fmt::__handle_raw_union_tag', symObjAddr: 0x7874, symBinAddr: 0x10001B4CC, symSize: 0x1464 } + - { offset: 0xBCE6, size: 0x8, addend: 0x0, symName: '_fmt::__handle_raw_union_tag', symObjAddr: 0x7874, symBinAddr: 0x10001B4CC, symSize: 0x1464 } + - { offset: 0xBCEE, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_soa_struct_internal', symObjAddr: 0x8CD8, symBinAddr: 0x10001C930, symSize: 0xC60 } + - { offset: 0xBD84, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_soa_struct_internal', symObjAddr: 0x8CD8, symBinAddr: 0x10001C930, symSize: 0xC60 } + - { offset: 0xC17D, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_soa_struct_internal', symObjAddr: 0x8CD8, symBinAddr: 0x10001C930, symSize: 0xC60 } + - { offset: 0xC185, size: 0x8, addend: 0x0, symName: '_fmt::fmt_struct', symObjAddr: 0x9938, symBinAddr: 0x10001D590, symSize: 0xCBC } + - { offset: 0xC405, size: 0x8, addend: 0x0, symName: '_fmt::fmt_struct', symObjAddr: 0x9938, symBinAddr: 0x10001D590, symSize: 0xCBC } + - { offset: 0xC40D, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::search_nul_termination', symObjAddr: 0xA5F4, symBinAddr: 0x10001E24C, symSize: 0xCC } + - { offset: 0xC5F2, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::search_nul_termination', symObjAddr: 0xA5F4, symBinAddr: 0x10001E24C, symSize: 0xCC } + - { offset: 0xC5FA, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array_nul_terminated', symObjAddr: 0xA6C0, symBinAddr: 0x10001E318, symSize: 0x110 } + - { offset: 0xC689, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array_nul_terminated', symObjAddr: 0xA6C0, symBinAddr: 0x10001E318, symSize: 0x110 } + - { offset: 0xC691, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array', symObjAddr: 0xA7D0, symBinAddr: 0x10001E428, symSize: 0x5D0 } + - { offset: 0xC73D, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array', symObjAddr: 0xA7D0, symBinAddr: 0x10001E428, symSize: 0x5D0 } + - { offset: 0xC745, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters', symObjAddr: 0xADA0, symBinAddr: 0x10001E9F8, symSize: 0xE7C } + - { offset: 0xC7CF, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters', symObjAddr: 0xADA0, symBinAddr: 0x10001E9F8, symSize: 0xE7C } + - { offset: 0xC7D7, size: 0x8, addend: 0x0, symName: '_fmt::fmt_named', symObjAddr: 0xBC1C, symBinAddr: 0x10001F874, symSize: 0x320 } + - { offset: 0xC97B, size: 0x8, addend: 0x0, symName: '_fmt::fmt_named', symObjAddr: 0xBC1C, symBinAddr: 0x10001F874, symSize: 0x320 } + - { offset: 0xC983, size: 0x8, addend: 0x0, symName: '_fmt::fmt_union', symObjAddr: 0xBF3C, symBinAddr: 0x10001FB94, symSize: 0x6A8 } + - { offset: 0xC9ED, size: 0x8, addend: 0x0, symName: '_fmt::fmt_union', symObjAddr: 0xBF3C, symBinAddr: 0x10001FB94, symSize: 0x6A8 } + - { offset: 0xC9F5, size: 0x8, addend: 0x0, symName: '_fmt::fmt_matrix', symObjAddr: 0xC5E4, symBinAddr: 0x10002023C, symSize: 0x6A8 } + - { offset: 0xCB63, size: 0x8, addend: 0x0, symName: '_fmt::fmt_matrix', symObjAddr: 0xC5E4, symBinAddr: 0x10002023C, symSize: 0x6A8 } + - { offset: 0xCB6B, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field', symObjAddr: 0xCC8C, symBinAddr: 0x1000208E4, symSize: 0x624 } + - { offset: 0xCCEC, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field', symObjAddr: 0xCC8C, symBinAddr: 0x1000208E4, symSize: 0x624 } + - { offset: 0xCCF4, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_pointer_from_value', symObjAddr: 0xD2B0, symBinAddr: 0x100020F08, symSize: 0x3C8 } + - { offset: 0xCE82, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_pointer_from_value', symObjAddr: 0xD2B0, symBinAddr: 0x100020F08, symSize: 0x3C8 } + - { offset: 0xCE8A, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_multi_pointer', symObjAddr: 0xD678, symBinAddr: 0x1000212D0, symSize: 0x52C } + - { offset: 0xCF4B, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_multi_pointer', symObjAddr: 0xD678, symBinAddr: 0x1000212D0, symSize: 0x52C } + - { offset: 0xCF53, size: 0x8, addend: 0x0, symName: '_fmt::fmt_enumerated_array', symObjAddr: 0xDBA4, symBinAddr: 0x1000217FC, symSize: 0x6D8 } + - { offset: 0xD06B, size: 0x8, addend: 0x0, symName: '_fmt::fmt_enumerated_array', symObjAddr: 0xDBA4, symBinAddr: 0x1000217FC, symSize: 0x6D8 } + - { offset: 0xD073, size: 0x8, addend: 0x0, symName: '_fmt::fmt_map', symObjAddr: 0xE27C, symBinAddr: 0x100021ED4, symSize: 0x79C } + - { offset: 0xD1D0, size: 0x8, addend: 0x0, symName: '_fmt::fmt_map', symObjAddr: 0xE27C, symBinAddr: 0x100021ED4, symSize: 0x79C } + - { offset: 0xD1D8, size: 0x8, addend: 0x0, symName: '_fmt::fmt_value', symObjAddr: 0xEA18, symBinAddr: 0x100022670, symSize: 0xCEC } + - { offset: 0xD356, size: 0x8, addend: 0x0, symName: '_fmt::fmt_value', symObjAddr: 0xEA18, symBinAddr: 0x100022670, symSize: 0xCEC } + - { offset: 0xD35E, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::_cq_should_print_intermediate_plus', symObjAddr: 0xF704, symBinAddr: 0x10002335C, symSize: 0xA0 } + - { offset: 0xD692, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::_cq_should_print_intermediate_plus', symObjAddr: 0xF704, symBinAddr: 0x10002335C, symSize: 0xA0 } + - { offset: 0xD69A, size: 0x8, addend: 0x0, symName: '_fmt::fmt_complex', symObjAddr: 0xF7A4, symBinAddr: 0x1000233FC, symSize: 0x1A4 } + - { offset: 0xD6D5, size: 0x8, addend: 0x0, symName: '_fmt::fmt_complex', symObjAddr: 0xF7A4, symBinAddr: 0x1000233FC, symSize: 0x1A4 } + - { offset: 0xD6DD, size: 0x8, addend: 0x0, symName: '_fmt::fmt_quaternion', symObjAddr: 0xF948, symBinAddr: 0x1000235A0, symSize: 0x338 } + - { offset: 0xD77B, size: 0x8, addend: 0x0, symName: '_fmt::fmt_quaternion', symObjAddr: 0xF948, symBinAddr: 0x1000235A0, symSize: 0x338 } + - { offset: 0xD783, size: 0x8, addend: 0x0, symName: '_fmt::fmt_arg', symObjAddr: 0xFC80, symBinAddr: 0x1000238D8, symSize: 0x153C } + - { offset: 0xD843, size: 0x8, addend: 0x0, symName: '_fmt::fmt_arg', symObjAddr: 0xFC80, symBinAddr: 0x1000238D8, symSize: 0x153C } + - { offset: 0xD84B, size: 0x8, addend: 0x0, symName: '_fmt::wprintf.parse_options-0', symObjAddr: 0x111BC, symBinAddr: 0x100024E14, symSize: 0x808 } + - { offset: 0xE141, size: 0x8, addend: 0x0, symName: '_fmt::wprintf.parse_options-0', symObjAddr: 0x111BC, symBinAddr: 0x100024E14, symSize: 0x808 } + - { offset: 0xE149, size: 0x8, addend: 0x0, symName: '_fmt::wprintf.error_check_arg-1', symObjAddr: 0x119C4, symBinAddr: 0x10002561C, symSize: 0x168 } + - { offset: 0xE1EF, size: 0x8, addend: 0x0, symName: '_fmt::wprintf.error_check_arg-1', symObjAddr: 0x119C4, symBinAddr: 0x10002561C, symSize: 0x168 } + - { offset: 0xE296, size: 0x8, addend: 0x0, symName: '_fmt::wprintf.error_check_arg-1', symObjAddr: 0x119C4, symBinAddr: 0x10002561C, symSize: 0x168 } + - { offset: 0xE29E, size: 0x8, addend: 0x0, symName: '_fmt::_parse_int.is_digit-0', symObjAddr: 0x11B2C, symBinAddr: 0x100025784, symSize: 0x5C } + - { offset: 0xE31F, size: 0x8, addend: 0x0, symName: '_fmt::_parse_int.is_digit-0', symObjAddr: 0x11B2C, symBinAddr: 0x100025784, symSize: 0x5C } + - { offset: 0xE327, size: 0x8, addend: 0x0, symName: '_fmt::_arg_number.parse_arg_number-0', symObjAddr: 0x11B88, symBinAddr: 0x1000257E0, symSize: 0x208 } + - { offset: 0xE353, size: 0x8, addend: 0x0, symName: '_fmt::_arg_number.parse_arg_number-0', symObjAddr: 0x11B88, symBinAddr: 0x1000257E0, symSize: 0x208 } + - { offset: 0xE35B, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_set.is_bit_set_different_endian_to_platform-0', symObjAddr: 0x11D90, symBinAddr: 0x1000259E8, symSize: 0xD8 } + - { offset: 0xE402, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_set.is_bit_set_different_endian_to_platform-0', symObjAddr: 0x11D90, symBinAddr: 0x1000259E8, symSize: 0xD8 } + - { offset: 0xE40A, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::handle_tag.handle_optional_len-0', symObjAddr: 0x11E68, symBinAddr: 0x100025AC0, symSize: 0x238 } + - { offset: 0xE43D, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::handle_tag.handle_optional_len-0', symObjAddr: 0x11E68, symBinAddr: 0x100025AC0, symSize: 0x238 } + - { offset: 0xE458, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::handle_tag.handle_optional_len-0', symObjAddr: 0x11E68, symBinAddr: 0x100025AC0, symSize: 0x238 } + - { offset: 0xE460, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf16-0', symObjAddr: 0x120A0, symBinAddr: 0x100025CF8, symSize: 0x3A0 } + - { offset: 0xE566, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf16-0', symObjAddr: 0x120A0, symBinAddr: 0x100025CF8, symSize: 0x3A0 } + - { offset: 0xE56E, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf16-1', symObjAddr: 0x12440, symBinAddr: 0x100026098, symSize: 0x3FC } + - { offset: 0xE644, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf16-1', symObjAddr: 0x12440, symBinAddr: 0x100026098, symSize: 0x3FC } + - { offset: 0xE64C, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-2', symObjAddr: 0x1283C, symBinAddr: 0x100026494, symSize: 0xBC } + - { offset: 0xE722, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-2', symObjAddr: 0x1283C, symBinAddr: 0x100026494, symSize: 0xBC } + - { offset: 0xE72A, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-3', symObjAddr: 0x128F8, symBinAddr: 0x100026550, symSize: 0xBC } + - { offset: 0xE797, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-3', symObjAddr: 0x128F8, symBinAddr: 0x100026550, symSize: 0xBC } + - { offset: 0xE79F, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-4', symObjAddr: 0x129B4, symBinAddr: 0x10002660C, symSize: 0xC0 } + - { offset: 0xE80C, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-4', symObjAddr: 0x129B4, symBinAddr: 0x10002660C, symSize: 0xC0 } + - { offset: 0xE814, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-5', symObjAddr: 0x12A74, symBinAddr: 0x1000266CC, symSize: 0xBC } + - { offset: 0xE881, size: 0x8, addend: 0x0, symName: '_fmt::fmt_array.print_utf32-5', symObjAddr: 0x12A74, symBinAddr: 0x1000266CC, symSize: 0xBC } + - { offset: 0xE889, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.ffrac-0', symObjAddr: 0x12B30, symBinAddr: 0x100026788, symSize: 0x200 } + - { offset: 0xE8F6, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.ffrac-0', symObjAddr: 0x12B30, symBinAddr: 0x100026788, symSize: 0x200 } + - { offset: 0xE8FE, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.fint-1', symObjAddr: 0x12D30, symBinAddr: 0x100026988, symSize: 0x158 } + - { offset: 0xE974, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.fint-1', symObjAddr: 0x12D30, symBinAddr: 0x100026988, symSize: 0x158 } + - { offset: 0xE9D5, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.fint-1', symObjAddr: 0x12D30, symBinAddr: 0x100026988, symSize: 0x158 } + - { offset: 0xE9DD, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.write_padded_number-2', symObjAddr: 0x12E88, symBinAddr: 0x100026AE0, symSize: 0x140 } + - { offset: 0xEA21, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.write_padded_number-2', symObjAddr: 0x12E88, symBinAddr: 0x100026AE0, symSize: 0x140 } + - { offset: 0xEA4E, size: 0x8, addend: 0x0, symName: '_fmt::[fmt.odin]::fmt_named_buitlin_custom_formatters.write_padded_number-2', symObjAddr: 0x12E88, symBinAddr: 0x100026AE0, symSize: 0x140 } + - { offset: 0xEA56, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field.read_bits-0', symObjAddr: 0x12FC8, symBinAddr: 0x100026C20, symSize: 0x11C } + - { offset: 0xEAF6, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field.read_bits-0', symObjAddr: 0x12FC8, symBinAddr: 0x100026C20, symSize: 0x11C } + - { offset: 0xEAFE, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field.handle_bit_field_tag-1', symObjAddr: 0x130E4, symBinAddr: 0x100026D3C, symSize: 0x2D4 } + - { offset: 0xEBC1, size: 0x8, addend: 0x0, symName: '_fmt::fmt_bit_field.handle_bit_field_tag-1', symObjAddr: 0x130E4, symBinAddr: 0x100026D3C, symSize: 0x2D4 } + - { offset: 0xEBC9, size: 0x8, addend: 0x0, symName: '___$hasher$$typeid', symObjAddr: 0x133B8, symBinAddr: 0x100027010, symSize: 0x34 } + - { offset: 0xEC4F, size: 0x8, addend: 0x0, symName: '___$hasher$$typeid', symObjAddr: 0x133B8, symBinAddr: 0x100027010, symSize: 0x34 } + - { offset: 0x110C6, size: 0x8, addend: 0x0, symName: '_runtime::encode_rune', symObjAddr: 0x0, symBinAddr: 0x100027194, symSize: 0x210 } + - { offset: 0x111C1, size: 0x8, addend: 0x0, symName: '_runtime::encode_rune', symObjAddr: 0x0, symBinAddr: 0x100027194, symSize: 0x210 } + - { offset: 0x111C9, size: 0x8, addend: 0x0, symName: '_runtime::print_string', symObjAddr: 0x210, symBinAddr: 0x1000273A4, symSize: 0x68 } + - { offset: 0x111FB, size: 0x8, addend: 0x0, symName: '_runtime::print_string', symObjAddr: 0x210, symBinAddr: 0x1000273A4, symSize: 0x68 } + - { offset: 0x11236, size: 0x8, addend: 0x0, symName: '_runtime::print_string', symObjAddr: 0x210, symBinAddr: 0x1000273A4, symSize: 0x68 } + - { offset: 0x1123E, size: 0x8, addend: 0x0, symName: '_runtime::print_byte', symObjAddr: 0x278, symBinAddr: 0x10002740C, symSize: 0x90 } + - { offset: 0x11278, size: 0x8, addend: 0x0, symName: '_runtime::print_byte', symObjAddr: 0x278, symBinAddr: 0x10002740C, symSize: 0x90 } + - { offset: 0x11280, size: 0x8, addend: 0x0, symName: '_runtime::print_encoded_rune', symObjAddr: 0x308, symBinAddr: 0x10002749C, symSize: 0x344 } + - { offset: 0x112BB, size: 0x8, addend: 0x0, symName: '_runtime::print_encoded_rune', symObjAddr: 0x308, symBinAddr: 0x10002749C, symSize: 0x344 } + - { offset: 0x112C3, size: 0x8, addend: 0x0, symName: '_runtime::print_rune', symObjAddr: 0x64C, symBinAddr: 0x1000277E0, symSize: 0xC8 } + - { offset: 0x1131C, size: 0x8, addend: 0x0, symName: '_runtime::print_rune', symObjAddr: 0x64C, symBinAddr: 0x1000277E0, symSize: 0xC8 } + - { offset: 0x11324, size: 0x8, addend: 0x0, symName: '_runtime::print_u64', symObjAddr: 0x714, symBinAddr: 0x1000278A8, symSize: 0x13C } + - { offset: 0x11356, size: 0x8, addend: 0x0, symName: '_runtime::print_u64', symObjAddr: 0x714, symBinAddr: 0x1000278A8, symSize: 0x13C } + - { offset: 0x11390, size: 0x8, addend: 0x0, symName: '_runtime::print_u64', symObjAddr: 0x714, symBinAddr: 0x1000278A8, symSize: 0x13C } + - { offset: 0x11398, size: 0x8, addend: 0x0, symName: '_runtime::print_i64', symObjAddr: 0x850, symBinAddr: 0x1000279E4, symSize: 0x180 } + - { offset: 0x11401, size: 0x8, addend: 0x0, symName: '_runtime::print_i64', symObjAddr: 0x850, symBinAddr: 0x1000279E4, symSize: 0x180 } + - { offset: 0x11409, size: 0x8, addend: 0x0, symName: '_runtime::print_caller_location', symObjAddr: 0x9D0, symBinAddr: 0x100027B64, symSize: 0x88 } + - { offset: 0x11482, size: 0x8, addend: 0x0, symName: '_runtime::print_caller_location', symObjAddr: 0x9D0, symBinAddr: 0x100027B64, symSize: 0x88 } + - { offset: 0x1148A, size: 0x8, addend: 0x0, symName: '_runtime::print_typeid', symObjAddr: 0xA58, symBinAddr: 0x100027BEC, symSize: 0x70 } + - { offset: 0x114B1, size: 0x8, addend: 0x0, symName: '_runtime::print_typeid', symObjAddr: 0xA58, symBinAddr: 0x100027BEC, symSize: 0x70 } + - { offset: 0x114B9, size: 0x8, addend: 0x0, symName: '_runtime::print_type', symObjAddr: 0xAC8, symBinAddr: 0x100027C5C, symSize: 0x15EC } + - { offset: 0x11501, size: 0x8, addend: 0x0, symName: '_runtime::print_type', symObjAddr: 0xAC8, symBinAddr: 0x100027C5C, symSize: 0x15EC } + - { offset: 0x11509, size: 0x8, addend: 0x0, symName: '_runtime::write_string', symObjAddr: 0x20B4, symBinAddr: 0x100029248, symSize: 0x124 } + - { offset: 0x1173C, size: 0x8, addend: 0x0, symName: '_runtime::write_string', symObjAddr: 0x20B4, symBinAddr: 0x100029248, symSize: 0x124 } + - { offset: 0x11744, size: 0x8, addend: 0x0, symName: '_runtime::write_byte', symObjAddr: 0x21D8, symBinAddr: 0x10002936C, symSize: 0xD8 } + - { offset: 0x11791, size: 0x8, addend: 0x0, symName: '_runtime::write_byte', symObjAddr: 0x21D8, symBinAddr: 0x10002936C, symSize: 0xD8 } + - { offset: 0x11799, size: 0x8, addend: 0x0, symName: '_runtime::write_u64', symObjAddr: 0x22B0, symBinAddr: 0x100029444, symSize: 0x300 } + - { offset: 0x117E6, size: 0x8, addend: 0x0, symName: '_runtime::write_u64', symObjAddr: 0x22B0, symBinAddr: 0x100029444, symSize: 0x300 } + - { offset: 0x117EE, size: 0x8, addend: 0x0, symName: '_runtime::write_i64', symObjAddr: 0x25B0, symBinAddr: 0x100029744, symSize: 0x380 } + - { offset: 0x11880, size: 0x8, addend: 0x0, symName: '_runtime::write_i64', symObjAddr: 0x25B0, symBinAddr: 0x100029744, symSize: 0x380 } + - { offset: 0x11888, size: 0x8, addend: 0x0, symName: '_runtime::write_typeid', symObjAddr: 0x2930, symBinAddr: 0x100029AC4, symSize: 0x11C } + - { offset: 0x1192B, size: 0x8, addend: 0x0, symName: '_runtime::write_typeid', symObjAddr: 0x2930, symBinAddr: 0x100029AC4, symSize: 0x11C } + - { offset: 0x11933, size: 0x8, addend: 0x0, symName: '_runtime::write_rune', symObjAddr: 0x2A4C, symBinAddr: 0x100029BE0, symSize: 0x218 } + - { offset: 0x119A3, size: 0x8, addend: 0x0, symName: '_runtime::write_rune', symObjAddr: 0x2A4C, symBinAddr: 0x100029BE0, symSize: 0x218 } + - { offset: 0x119AB, size: 0x8, addend: 0x0, symName: '_runtime::write_encoded_rune', symObjAddr: 0x2C64, symBinAddr: 0x100029DF8, symSize: 0x6FC } + - { offset: 0x11A21, size: 0x8, addend: 0x0, symName: '_runtime::write_encoded_rune', symObjAddr: 0x2C64, symBinAddr: 0x100029DF8, symSize: 0x6FC } + - { offset: 0x11A5F, size: 0x8, addend: 0x0, symName: '_runtime::write_encoded_rune', symObjAddr: 0x2C64, symBinAddr: 0x100029DF8, symSize: 0x6FC } + - { offset: 0x11A67, size: 0x8, addend: 0x0, symName: '_runtime::write_write_type', symObjAddr: 0x3360, symBinAddr: 0x10002A4F4, symSize: 0x38F0 } + - { offset: 0x11AE8, size: 0x8, addend: 0x0, symName: '_runtime::write_write_type', symObjAddr: 0x3360, symBinAddr: 0x10002A4F4, symSize: 0x38F0 } + - { offset: 0x1282B, size: 0x8, addend: 0x0, symName: '_runtime::bounds_trap', symObjAddr: 0x0, symBinAddr: 0x10002DDE4, symSize: 0x8 } + - { offset: 0x12A1D, size: 0x8, addend: 0x0, symName: '_runtime::bounds_trap', symObjAddr: 0x0, symBinAddr: 0x10002DDE4, symSize: 0x8 } + - { offset: 0x12A25, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_trap_contextless', symObjAddr: 0x8, symBinAddr: 0x10002DDEC, symSize: 0x8 } + - { offset: 0x12A3D, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_trap_contextless', symObjAddr: 0x8, symBinAddr: 0x10002DDEC, symSize: 0x8 } + - { offset: 0x12A45, size: 0x8, addend: 0x0, symName: '_runtime::bounds_check_error', symObjAddr: 0x10, symBinAddr: 0x10002DDF4, symSize: 0xAC } + - { offset: 0x12A5D, size: 0x8, addend: 0x0, symName: '_runtime::bounds_check_error', symObjAddr: 0x10, symBinAddr: 0x10002DDF4, symSize: 0xAC } + - { offset: 0x12A65, size: 0x8, addend: 0x0, symName: '_runtime::slice_handle_error', symObjAddr: 0xBC, symBinAddr: 0x10002DEA0, symSize: 0x150 } + - { offset: 0x12AC8, size: 0x8, addend: 0x0, symName: '_runtime::slice_handle_error', symObjAddr: 0xBC, symBinAddr: 0x10002DEA0, symSize: 0x150 } + - { offset: 0x12AD0, size: 0x8, addend: 0x0, symName: '_runtime::multi_pointer_slice_handle_error', symObjAddr: 0x20C, symBinAddr: 0x10002DFF0, symSize: 0x118 } + - { offset: 0x12B43, size: 0x8, addend: 0x0, symName: '_runtime::multi_pointer_slice_handle_error', symObjAddr: 0x20C, symBinAddr: 0x10002DFF0, symSize: 0x118 } + - { offset: 0x12B4B, size: 0x8, addend: 0x0, symName: '_runtime::multi_pointer_slice_expr_error', symObjAddr: 0x324, symBinAddr: 0x10002E108, symSize: 0xAC } + - { offset: 0x12BAF, size: 0x8, addend: 0x0, symName: '_runtime::multi_pointer_slice_expr_error', symObjAddr: 0x324, symBinAddr: 0x10002E108, symSize: 0xAC } + - { offset: 0x12BB7, size: 0x8, addend: 0x0, symName: '_runtime::slice_expr_error_hi', symObjAddr: 0x3D0, symBinAddr: 0x10002E1B4, symSize: 0xCC } + - { offset: 0x12C1A, size: 0x8, addend: 0x0, symName: '_runtime::slice_expr_error_hi', symObjAddr: 0x3D0, symBinAddr: 0x10002E1B4, symSize: 0xCC } + - { offset: 0x12C22, size: 0x8, addend: 0x0, symName: '_runtime::slice_expr_error_lo_hi', symObjAddr: 0x49C, symBinAddr: 0x10002E280, symSize: 0x108 } + - { offset: 0x12C85, size: 0x8, addend: 0x0, symName: '_runtime::slice_expr_error_lo_hi', symObjAddr: 0x49C, symBinAddr: 0x10002E280, symSize: 0x108 } + - { offset: 0x12C8D, size: 0x8, addend: 0x0, symName: '_runtime::matrix_bounds_check_error', symObjAddr: 0x5A4, symBinAddr: 0x10002E388, symSize: 0xE4 } + - { offset: 0x12CFF, size: 0x8, addend: 0x0, symName: '_runtime::matrix_bounds_check_error', symObjAddr: 0x5A4, symBinAddr: 0x10002E388, symSize: 0xE4 } + - { offset: 0x12D07, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context', symObjAddr: 0x688, symBinAddr: 0x10002E46C, symSize: 0xB8 } + - { offset: 0x12D88, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context', symObjAddr: 0x688, symBinAddr: 0x10002E46C, symSize: 0xB8 } + - { offset: 0x12D90, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_contextless', symObjAddr: 0x740, symBinAddr: 0x10002E524, symSize: 0xB0 } + - { offset: 0x12E13, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_contextless', symObjAddr: 0x740, symBinAddr: 0x10002E524, symSize: 0xB0 } + - { offset: 0x12E1B, size: 0x8, addend: 0x0, symName: '_runtime::[error_checks.odin]::type_assertion_variant_type', symObjAddr: 0x7F0, symBinAddr: 0x10002E5D4, symSize: 0x348 } + - { offset: 0x12E8D, size: 0x8, addend: 0x0, symName: '_runtime::[error_checks.odin]::type_assertion_variant_type', symObjAddr: 0x7F0, symBinAddr: 0x10002E5D4, symSize: 0x348 } + - { offset: 0x12E95, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context', symObjAddr: 0xB38, symBinAddr: 0x10002E91C, symSize: 0xCC } + - { offset: 0x12ED6, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context', symObjAddr: 0xB38, symBinAddr: 0x10002E91C, symSize: 0xCC } + - { offset: 0x12F47, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context', symObjAddr: 0xB38, symBinAddr: 0x10002E91C, symSize: 0xCC } + - { offset: 0x12F4F, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_contextless', symObjAddr: 0xC04, symBinAddr: 0x10002E9E8, symSize: 0xC0 } + - { offset: 0x12FEA, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_contextless', symObjAddr: 0xC04, symBinAddr: 0x10002E9E8, symSize: 0xC0 } + - { offset: 0x12FF2, size: 0x8, addend: 0x0, symName: '_runtime::make_slice_error_loc', symObjAddr: 0xCC4, symBinAddr: 0x10002EAA8, symSize: 0x48 } + - { offset: 0x1307B, size: 0x8, addend: 0x0, symName: '_runtime::make_slice_error_loc', symObjAddr: 0xCC4, symBinAddr: 0x10002EAA8, symSize: 0x48 } + - { offset: 0x13083, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array_error_loc', symObjAddr: 0xD0C, symBinAddr: 0x10002EAF0, symSize: 0x70 } + - { offset: 0x130BB, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array_error_loc', symObjAddr: 0xD0C, symBinAddr: 0x10002EAF0, symSize: 0x70 } + - { offset: 0x130C3, size: 0x8, addend: 0x0, symName: '_runtime::bounds_check_error.handle_error-0', symObjAddr: 0xD7C, symBinAddr: 0x1000F2230, symSize: 0x118 } + - { offset: 0x1310A, size: 0x8, addend: 0x0, symName: '_runtime::bounds_check_error.handle_error-0', symObjAddr: 0xD7C, symBinAddr: 0x1000F2230, symSize: 0x118 } + - { offset: 0x13112, size: 0x8, addend: 0x0, symName: '_runtime::matrix_bounds_check_error.handle_error-0', symObjAddr: 0xE94, symBinAddr: 0x1000F2348, symSize: 0x1A4 } + - { offset: 0x13176, size: 0x8, addend: 0x0, symName: '_runtime::matrix_bounds_check_error.handle_error-0', symObjAddr: 0xE94, symBinAddr: 0x1000F2348, symSize: 0x1A4 } + - { offset: 0x1317E, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context.handle_error-0', symObjAddr: 0x1038, symBinAddr: 0x1000F24EC, symSize: 0x214 } + - { offset: 0x13200, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context.handle_error-0', symObjAddr: 0x1038, symBinAddr: 0x1000F24EC, symSize: 0x214 } + - { offset: 0x13208, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_contextless.handle_error-0', symObjAddr: 0x124C, symBinAddr: 0x1000F2700, symSize: 0x118 } + - { offset: 0x13284, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_contextless.handle_error-0', symObjAddr: 0x124C, symBinAddr: 0x1000F2700, symSize: 0x118 } + - { offset: 0x132BF, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_contextless.handle_error-0', symObjAddr: 0x124C, symBinAddr: 0x1000F2700, symSize: 0x118 } + - { offset: 0x132C7, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context.handle_error-0', symObjAddr: 0x1364, symBinAddr: 0x1000F2818, symSize: 0x234 } + - { offset: 0x1332B, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context.handle_error-0', symObjAddr: 0x1364, symBinAddr: 0x1000F2818, symSize: 0x234 } + - { offset: 0x13333, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_contextless.handle_error-0', symObjAddr: 0x1598, symBinAddr: 0x1000F2A4C, symSize: 0x178 } + - { offset: 0x133C6, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_contextless.handle_error-0', symObjAddr: 0x1598, symBinAddr: 0x1000F2A4C, symSize: 0x178 } + - { offset: 0x13415, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_contextless.handle_error-0', symObjAddr: 0x1598, symBinAddr: 0x1000F2A4C, symSize: 0x178 } + - { offset: 0x1341D, size: 0x8, addend: 0x0, symName: '_runtime::make_slice_error_loc.handle_error-0', symObjAddr: 0x1710, symBinAddr: 0x1000F2BC4, symSize: 0x58 } + - { offset: 0x1349E, size: 0x8, addend: 0x0, symName: '_runtime::make_slice_error_loc.handle_error-0', symObjAddr: 0x1710, symBinAddr: 0x1000F2BC4, symSize: 0x58 } + - { offset: 0x134BA, size: 0x8, addend: 0x0, symName: '_runtime::make_slice_error_loc.handle_error-0', symObjAddr: 0x1710, symBinAddr: 0x1000F2BC4, symSize: 0x58 } + - { offset: 0x134C2, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array_error_loc.handle_error-0', symObjAddr: 0x1768, symBinAddr: 0x1000F2C1C, symSize: 0x74 } + - { offset: 0x134FB, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array_error_loc.handle_error-0', symObjAddr: 0x1768, symBinAddr: 0x1000F2C1C, symSize: 0x74 } + - { offset: 0x13503, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context.handle_error-0.do_msg-0', symObjAddr: 0x17DC, symBinAddr: 0x10002EB60, symSize: 0x1DC } + - { offset: 0x1354B, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check_with_context.handle_error-0.do_msg-0', symObjAddr: 0x17DC, symBinAddr: 0x10002EB60, symSize: 0x1DC } + - { offset: 0x13553, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context.handle_error-0.do_msg-0', symObjAddr: 0x19B8, symBinAddr: 0x10002ED3C, symSize: 0x2A8 } + - { offset: 0x135D8, size: 0x8, addend: 0x0, symName: '_runtime::type_assertion_check2_with_context.handle_error-0.do_msg-0', symObjAddr: 0x19B8, symBinAddr: 0x10002ED3C, symSize: 0x2A8 } + - { offset: 0x143C2, size: 0x8, addend: 0x0, symName: '_runtime::random_generator_read_ptr', symObjAddr: 0x0, symBinAddr: 0x10002EFE4, symSize: 0xE4 } + - { offset: 0x144BD, size: 0x8, addend: 0x0, symName: '_runtime::random_generator_read_ptr', symObjAddr: 0x0, symBinAddr: 0x10002EFE4, symSize: 0xE4 } + - { offset: 0x148B9, size: 0x8, addend: 0x0, symName: '_strconv_decimal::trim', symObjAddr: 0x0, symBinAddr: 0x10002F0C8, symSize: 0xD8 } + - { offset: 0x149B4, size: 0x8, addend: 0x0, symName: '_strconv_decimal::trim', symObjAddr: 0x0, symBinAddr: 0x10002F0C8, symSize: 0xD8 } + - { offset: 0x149BC, size: 0x8, addend: 0x0, symName: '_strconv_decimal::assign', symObjAddr: 0xD8, symBinAddr: 0x10002F1A0, symSize: 0x214 } + - { offset: 0x149E2, size: 0x8, addend: 0x0, symName: '_strconv_decimal::assign', symObjAddr: 0xD8, symBinAddr: 0x10002F1A0, symSize: 0x214 } + - { offset: 0x149EA, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_right', symObjAddr: 0x2EC, symBinAddr: 0x10002F3B4, symSize: 0x404 } + - { offset: 0x14A8F, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_right', symObjAddr: 0x2EC, symBinAddr: 0x10002F3B4, symSize: 0x404 } + - { offset: 0x14A97, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_left', symObjAddr: 0x6F0, symBinAddr: 0x10002F7B8, symSize: 0x314 } + - { offset: 0x14BA6, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_left', symObjAddr: 0x6F0, symBinAddr: 0x10002F7B8, symSize: 0x314 } + - { offset: 0x14BAE, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift', symObjAddr: 0xA04, symBinAddr: 0x10002FACC, symSize: 0x128 } + - { offset: 0x14CB1, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift', symObjAddr: 0xA04, symBinAddr: 0x10002FACC, symSize: 0x128 } + - { offset: 0x14CB9, size: 0x8, addend: 0x0, symName: '_strconv_decimal::can_round_up', symObjAddr: 0xB2C, symBinAddr: 0x10002FBF4, symSize: 0x204 } + - { offset: 0x14D23, size: 0x8, addend: 0x0, symName: '_strconv_decimal::can_round_up', symObjAddr: 0xB2C, symBinAddr: 0x10002FBF4, symSize: 0x204 } + - { offset: 0x14D2B, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round', symObjAddr: 0xD30, symBinAddr: 0x10002FDF8, symSize: 0xB0 } + - { offset: 0x14D68, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round', symObjAddr: 0xD30, symBinAddr: 0x10002FDF8, symSize: 0xB0 } + - { offset: 0x14D70, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round_up', symObjAddr: 0xDE0, symBinAddr: 0x10002FEA8, symSize: 0x19C } + - { offset: 0x14DB8, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round_up', symObjAddr: 0xDE0, symBinAddr: 0x10002FEA8, symSize: 0x19C } + - { offset: 0x14DC0, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round_down', symObjAddr: 0xF7C, symBinAddr: 0x100030044, symSize: 0x84 } + - { offset: 0x14E3E, size: 0x8, addend: 0x0, symName: '_strconv_decimal::round_down', symObjAddr: 0xF7C, symBinAddr: 0x100030044, symSize: 0x84 } + - { offset: 0x14E46, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_left.prefix_less-0', symObjAddr: 0x1000, symBinAddr: 0x1000300C8, symSize: 0x110 } + - { offset: 0x14E8E, size: 0x8, addend: 0x0, symName: '_strconv_decimal::shift_left.prefix_less-0', symObjAddr: 0x1000, symBinAddr: 0x1000300C8, symSize: 0x110 } + - { offset: 0x1531B, size: 0x8, addend: 0x0, symName: '_bytes::index_byte', symObjAddr: 0x0, symBinAddr: 0x1000301D8, symSize: 0x8D8 } + - { offset: 0x15370, size: 0x8, addend: 0x0, symName: '_bytes::index_byte', symObjAddr: 0x0, symBinAddr: 0x1000301D8, symSize: 0x8D8 } + - { offset: 0x155D0, size: 0x8, addend: 0x0, symName: '_runtime::default_random_generator_proc', symObjAddr: 0x0, symBinAddr: 0x100030AB0, symSize: 0x4F0 } + - { offset: 0x155D8, size: 0x8, addend: 0x0, symName: '_runtime::default_random_generator_proc-.state-32193', symObjAddr: 0x570, symBinAddr: 0x10013FB08, symSize: 0x0 } + - { offset: 0x15750, size: 0x8, addend: 0x0, symName: '_runtime::default_random_generator_proc', symObjAddr: 0x0, symBinAddr: 0x100030AB0, symSize: 0x4F0 } + - { offset: 0x15758, size: 0x8, addend: 0x0, symName: '_runtime::[random_generator_chacha8.odin]::chacha8rand_refill', symObjAddr: 0x4F0, symBinAddr: 0x100030FA0, symSize: 0x80 } + - { offset: 0x158A7, size: 0x8, addend: 0x0, symName: '_runtime::[random_generator_chacha8.odin]::chacha8rand_refill', symObjAddr: 0x4F0, symBinAddr: 0x100030FA0, symSize: 0x80 } + - { offset: 0x158AF, size: 0x8, addend: 0x0, symName: '_runtime::default_random_generator_proc-.state-32193', symObjAddr: 0x570, symBinAddr: 0x10013FB08, symSize: 0x0 } + - { offset: 0x15D37, size: 0x8, addend: 0x0, symName: '_runtime::copy_slice_raw', symObjAddr: 0x0, symBinAddr: 0x100031020, symSize: 0x94 } + - { offset: 0x15E6A, size: 0x8, addend: 0x0, symName: '_runtime::copy_slice_raw', symObjAddr: 0x0, symBinAddr: 0x100031020, symSize: 0x94 } + - { offset: 0x15E72, size: 0x8, addend: 0x0, symName: '_runtime::copy_slice:proc"contextless"(dst:[]u8,src:[]u8)->(:int)', symObjAddr: 0x94, symBinAddr: 0x1000310B4, symSize: 0x64 } + - { offset: 0x15EDF, size: 0x8, addend: 0x0, symName: '_runtime::copy_slice:proc"contextless"(dst:[]u8,src:[]u8)->(:int)', symObjAddr: 0x94, symBinAddr: 0x1000310B4, symSize: 0x64 } + - { offset: 0x15EF9, size: 0x8, addend: 0x0, symName: '_runtime::copy_slice:proc"contextless"(dst:[]u8,src:[]u8)->(:int)', symObjAddr: 0x94, symBinAddr: 0x1000310B4, symSize: 0x64 } + - { offset: 0x15F01, size: 0x8, addend: 0x0, symName: '_runtime::copy_from_string:proc"contextless"(dst:[]u8,src:string)->(:int)', symObjAddr: 0xF8, symBinAddr: 0x100031118, symSize: 0x64 } + - { offset: 0x15F39, size: 0x8, addend: 0x0, symName: '_runtime::copy_from_string:proc"contextless"(dst:[]u8,src:string)->(:int)', symObjAddr: 0xF8, symBinAddr: 0x100031118, symSize: 0x64 } + - { offset: 0x15F41, size: 0x8, addend: 0x0, symName: '_runtime::delete_cstring', symObjAddr: 0x15C, symBinAddr: 0x10003117C, symSize: 0x6C } + - { offset: 0x15F79, size: 0x8, addend: 0x0, symName: '_runtime::delete_cstring', symObjAddr: 0x15C, symBinAddr: 0x10003117C, symSize: 0x6C } + - { offset: 0x15F81, size: 0x8, addend: 0x0, symName: '_runtime::delete_dynamic_array:proc(array:[dynamic]u8,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x1C8, symBinAddr: 0x1000311E8, symSize: 0x58 } + - { offset: 0x15FDF, size: 0x8, addend: 0x0, symName: '_runtime::delete_dynamic_array:proc(array:[dynamic]u8,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x1C8, symBinAddr: 0x1000311E8, symSize: 0x58 } + - { offset: 0x15FE7, size: 0x8, addend: 0x0, symName: '_runtime::delete_dynamic_array:proc(array:[dynamic]rune,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x220, symBinAddr: 0x100031240, symSize: 0x58 } + - { offset: 0x16035, size: 0x8, addend: 0x0, symName: '_runtime::delete_dynamic_array:proc(array:[dynamic]rune,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x220, symBinAddr: 0x100031240, symSize: 0x58 } + - { offset: 0x1603D, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]f32,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x278, symBinAddr: 0x100031298, symSize: 0x80 } + - { offset: 0x1608B, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]f32,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x278, symBinAddr: 0x100031298, symSize: 0x80 } + - { offset: 0x16093, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]i16,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x2F8, symBinAddr: 0x100031318, symSize: 0x80 } + - { offset: 0x160F1, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]i16,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x2F8, symBinAddr: 0x100031318, symSize: 0x80 } + - { offset: 0x160F9, size: 0x8, addend: 0x0, symName: '_runtime::_make_aligned_type_erased', symObjAddr: 0x378, symBinAddr: 0x100031398, symSize: 0x128 } + - { offset: 0x16157, size: 0x8, addend: 0x0, symName: '_runtime::_make_aligned_type_erased', symObjAddr: 0x378, symBinAddr: 0x100031398, symSize: 0x128 } + - { offset: 0x1615F, size: 0x8, addend: 0x0, symName: '_runtime::_make_dynamic_array_len_cap', symObjAddr: 0x4A0, symBinAddr: 0x1000314C0, symSize: 0x1B4 } + - { offset: 0x161F4, size: 0x8, addend: 0x0, symName: '_runtime::_make_dynamic_array_len_cap', symObjAddr: 0x4A0, symBinAddr: 0x1000314C0, symSize: 0x1B4 } + - { offset: 0x16221, size: 0x8, addend: 0x0, symName: '_runtime::_make_dynamic_array_len_cap', symObjAddr: 0x4A0, symBinAddr: 0x1000314C0, symSize: 0x1B4 } + - { offset: 0x16229, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]string,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x654, symBinAddr: 0x100031674, symSize: 0x80 } + - { offset: 0x162DF, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]string,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x654, symBinAddr: 0x100031674, symSize: 0x80 } + - { offset: 0x1630C, size: 0x8, addend: 0x0, symName: '_runtime::delete_slice:proc(array:[]string,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(:runtime::Allocator_Error)', symObjAddr: 0x654, symBinAddr: 0x100031674, symSize: 0x80 } + - { offset: 0x16314, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]i16,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]i16,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x6D4, symBinAddr: 0x1000316F4, symSize: 0xB8 } + - { offset: 0x16372, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]i16,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]i16,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x6D4, symBinAddr: 0x1000316F4, symSize: 0xB8 } + - { offset: 0x1637A, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]u8,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]u8,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x78C, symBinAddr: 0x1000317AC, symSize: 0xB8 } + - { offset: 0x163FA, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]u8,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]u8,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x78C, symBinAddr: 0x1000317AC, symSize: 0xB8 } + - { offset: 0x16402, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]int,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x844, symBinAddr: 0x100031864, symSize: 0xB8 } + - { offset: 0x16482, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]int,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x844, symBinAddr: 0x100031864, symSize: 0xB8 } + - { offset: 0x1648A, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]f32,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]f32,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x8FC, symBinAddr: 0x10003191C, symSize: 0xB8 } + - { offset: 0x1650A, size: 0x8, addend: 0x0, symName: '_runtime::make_slice:proc(T:$[]f32,len:int,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(res:[]f32,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x8FC, symBinAddr: 0x10003191C, symSize: 0xB8 } + - { offset: 0x16512, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array:proc(T:$[dynamic]rune,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(array:[dynamic]rune,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x9B4, symBinAddr: 0x1000319D4, symSize: 0xF8 } + - { offset: 0x16592, size: 0x8, addend: 0x0, symName: '_runtime::make_dynamic_array:proc(T:$[dynamic]rune,allocator:runtime::Allocator,loc:runtime::Source_Code_Location)->(array:[dynamic]rune,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0x9B4, symBinAddr: 0x1000319D4, symSize: 0xF8 } + - { offset: 0x1659A, size: 0x8, addend: 0x0, symName: '_runtime::_append_elem', symObjAddr: 0xAAC, symBinAddr: 0x100031ACC, symSize: 0x1F0 } + - { offset: 0x1660B, size: 0x8, addend: 0x0, symName: '_runtime::_append_elem', symObjAddr: 0xAAC, symBinAddr: 0x100031ACC, symSize: 0x1F0 } + - { offset: 0x16613, size: 0x8, addend: 0x0, symName: '_runtime::_append_elems', symObjAddr: 0xC9C, symBinAddr: 0x100031CBC, symSize: 0x268 } + - { offset: 0x16709, size: 0x8, addend: 0x0, symName: '_runtime::_append_elems', symObjAddr: 0xC9C, symBinAddr: 0x100031CBC, symSize: 0x268 } + - { offset: 0x16711, size: 0x8, addend: 0x0, symName: '_runtime::append_elem:proc(array:^[dynamic]rune,arg:rune,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF04, symBinAddr: 0x100031F24, symSize: 0x94 } + - { offset: 0x167D8, size: 0x8, addend: 0x0, symName: '_runtime::append_elem:proc(array:^[dynamic]rune,arg:rune,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF04, symBinAddr: 0x100031F24, symSize: 0x94 } + - { offset: 0x1683A, size: 0x8, addend: 0x0, symName: '_runtime::append_elem:proc(array:^[dynamic]rune,arg:rune,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF04, symBinAddr: 0x100031F24, symSize: 0x94 } + - { offset: 0x16842, size: 0x8, addend: 0x0, symName: '_runtime::append_elems:proc(array:^[dynamic]u8,args:..u8,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF98, symBinAddr: 0x100031FB8, symSize: 0xA0 } + - { offset: 0x168C9, size: 0x8, addend: 0x0, symName: '_runtime::append_elems:proc(array:^[dynamic]u8,args:..u8,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF98, symBinAddr: 0x100031FB8, symSize: 0xA0 } + - { offset: 0x168E5, size: 0x8, addend: 0x0, symName: '_runtime::append_elems:proc(array:^[dynamic]u8,args:..u8,loc:runtime::Source_Code_Location)->(num_appended:int,err:runtime::Allocator_Error)#optional_ok', symObjAddr: 0xF98, symBinAddr: 0x100031FB8, symSize: 0xA0 } + - { offset: 0x168ED, size: 0x8, addend: 0x0, symName: '_runtime::_reserve_dynamic_array', symObjAddr: 0x1038, symBinAddr: 0x100032058, symSize: 0x2E8 } + - { offset: 0x1696D, size: 0x8, addend: 0x0, symName: '_runtime::_reserve_dynamic_array', symObjAddr: 0x1038, symBinAddr: 0x100032058, symSize: 0x2E8 } + - { offset: 0x16975, size: 0x8, addend: 0x0, symName: '_runtime::_reserve_dynamic_array_unsafe', symObjAddr: 0x1320, symBinAddr: 0x100032340, symSize: 0x2C8 } + - { offset: 0x16A0A, size: 0x8, addend: 0x0, symName: '_runtime::_reserve_dynamic_array_unsafe', symObjAddr: 0x1320, symBinAddr: 0x100032340, symSize: 0x2C8 } + - { offset: 0x16A59, size: 0x8, addend: 0x0, symName: '_runtime::_reserve_dynamic_array_unsafe', symObjAddr: 0x1320, symBinAddr: 0x100032340, symSize: 0x2C8 } + - { offset: 0x16A61, size: 0x8, addend: 0x0, symName: '_runtime::assert', symObjAddr: 0x15E8, symBinAddr: 0x100032608, symSize: 0x84 } + - { offset: 0x16AF6, size: 0x8, addend: 0x0, symName: '_runtime::assert', symObjAddr: 0x15E8, symBinAddr: 0x100032608, symSize: 0x84 } + - { offset: 0x16B45, size: 0x8, addend: 0x0, symName: '_runtime::assert', symObjAddr: 0x15E8, symBinAddr: 0x100032608, symSize: 0x84 } + - { offset: 0x16B4D, size: 0x8, addend: 0x0, symName: '_runtime::panic', symObjAddr: 0x166C, symBinAddr: 0x10003268C, symSize: 0xB4 } + - { offset: 0x16BA7, size: 0x8, addend: 0x0, symName: '_runtime::panic', symObjAddr: 0x166C, symBinAddr: 0x10003268C, symSize: 0xB4 } + - { offset: 0x16BAF, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless', symObjAddr: 0x1720, symBinAddr: 0x100032740, symSize: 0x7C } + - { offset: 0x16C01, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless', symObjAddr: 0x1720, symBinAddr: 0x100032740, symSize: 0x7C } + - { offset: 0x16C1D, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless', symObjAddr: 0x1720, symBinAddr: 0x100032740, symSize: 0x7C } + - { offset: 0x16C25, size: 0x8, addend: 0x0, symName: '_runtime::panic_contextless', symObjAddr: 0x179C, symBinAddr: 0x1000327BC, symSize: 0x64 } + - { offset: 0x16C6E, size: 0x8, addend: 0x0, symName: '_runtime::panic_contextless', symObjAddr: 0x179C, symBinAddr: 0x1000327BC, symSize: 0x64 } + - { offset: 0x16C76, size: 0x8, addend: 0x0, symName: '_runtime::assert.internal-0', symObjAddr: 0x1800, symBinAddr: 0x1000F2C90, symSize: 0xB4 } + - { offset: 0x16CB0, size: 0x8, addend: 0x0, symName: '_runtime::assert.internal-0', symObjAddr: 0x1800, symBinAddr: 0x1000F2C90, symSize: 0xB4 } + - { offset: 0x16CB8, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless.internal-0', symObjAddr: 0x18B4, symBinAddr: 0x1000F2D44, symSize: 0x64 } + - { offset: 0x16D09, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless.internal-0', symObjAddr: 0x18B4, symBinAddr: 0x1000F2D44, symSize: 0x64 } + - { offset: 0x16D25, size: 0x8, addend: 0x0, symName: '_runtime::assert_contextless.internal-0', symObjAddr: 0x18B4, symBinAddr: 0x1000F2D44, symSize: 0x64 } + - { offset: 0x172C5, size: 0x8, addend: 0x0, symName: '_math::sin_f32', symObjAddr: 0x0, symBinAddr: 0x100032820, symSize: 0x1C } + - { offset: 0x1756A, size: 0x8, addend: 0x0, symName: '_math::sin_f32', symObjAddr: 0x0, symBinAddr: 0x100032820, symSize: 0x1C } + - { offset: 0x17572, size: 0x8, addend: 0x0, symName: '_math::cos_f32', symObjAddr: 0x1C, symBinAddr: 0x10003283C, symSize: 0x1C } + - { offset: 0x1759C, size: 0x8, addend: 0x0, symName: '_math::cos_f32', symObjAddr: 0x1C, symBinAddr: 0x10003283C, symSize: 0x1C } + - { offset: 0x175A4, size: 0x8, addend: 0x0, symName: '_math::exp_f32', symObjAddr: 0x38, symBinAddr: 0x100032858, symSize: 0x1C } + - { offset: 0x175CE, size: 0x8, addend: 0x0, symName: '_math::exp_f32', symObjAddr: 0x38, symBinAddr: 0x100032858, symSize: 0x1C } + - { offset: 0x175D6, size: 0x8, addend: 0x0, symName: '_math::sign_bit_f64', symObjAddr: 0x54, symBinAddr: 0x100032874, symSize: 0x2C } + - { offset: 0x17600, size: 0x8, addend: 0x0, symName: '_math::sign_bit_f64', symObjAddr: 0x54, symBinAddr: 0x100032874, symSize: 0x2C } + - { offset: 0x17608, size: 0x8, addend: 0x0, symName: '_math::copy_sign_f64', symObjAddr: 0x80, symBinAddr: 0x1000328A0, symSize: 0x6C } + - { offset: 0x17634, size: 0x8, addend: 0x0, symName: '_math::copy_sign_f64', symObjAddr: 0x80, symBinAddr: 0x1000328A0, symSize: 0x6C } + - { offset: 0x1763C, size: 0x8, addend: 0x0, symName: '_math::classify_f64', symObjAddr: 0xEC, symBinAddr: 0x10003290C, symSize: 0x14C } + - { offset: 0x17680, size: 0x8, addend: 0x0, symName: '_math::classify_f64', symObjAddr: 0xEC, symBinAddr: 0x10003290C, symSize: 0x14C } + - { offset: 0x176AB, size: 0x8, addend: 0x0, symName: '_math::classify_f64', symObjAddr: 0xEC, symBinAddr: 0x10003290C, symSize: 0x14C } + - { offset: 0x176B3, size: 0x8, addend: 0x0, symName: '_math::is_nan_f64', symObjAddr: 0x238, symBinAddr: 0x100032A58, symSize: 0x30 } + - { offset: 0x176E6, size: 0x8, addend: 0x0, symName: '_math::is_nan_f64', symObjAddr: 0x238, symBinAddr: 0x100032A58, symSize: 0x30 } + - { offset: 0x17733, size: 0x8, addend: 0x0, symName: '_math::is_nan_f64', symObjAddr: 0x238, symBinAddr: 0x100032A58, symSize: 0x30 } + - { offset: 0x1773B, size: 0x8, addend: 0x0, symName: '_math::is_inf_f64', symObjAddr: 0x268, symBinAddr: 0x100032A88, symSize: 0xD4 } + - { offset: 0x17767, size: 0x8, addend: 0x0, symName: '_math::is_inf_f64', symObjAddr: 0x268, symBinAddr: 0x100032A88, symSize: 0xD4 } + - { offset: 0x1776F, size: 0x8, addend: 0x0, symName: '_math::atan2_f32', symObjAddr: 0x33C, symBinAddr: 0x100032B5C, symSize: 0x40 } + - { offset: 0x177B1, size: 0x8, addend: 0x0, symName: '_math::atan2_f32', symObjAddr: 0x33C, symBinAddr: 0x100032B5C, symSize: 0x40 } + - { offset: 0x177CC, size: 0x8, addend: 0x0, symName: '_math::atan2_f32', symObjAddr: 0x33C, symBinAddr: 0x100032B5C, symSize: 0x40 } + - { offset: 0x177D4, size: 0x8, addend: 0x0, symName: '_math::atan2_f64', symObjAddr: 0x37C, symBinAddr: 0x100032B9C, symSize: 0x2A4 } + - { offset: 0x1780F, size: 0x8, addend: 0x0, symName: '_math::atan2_f64', symObjAddr: 0x37C, symBinAddr: 0x100032B9C, symSize: 0x2A4 } + - { offset: 0x17817, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.atan-0', symObjAddr: 0x620, symBinAddr: 0x100032E40, symSize: 0x7C } + - { offset: 0x17859, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.atan-0', symObjAddr: 0x620, symBinAddr: 0x100032E40, symSize: 0x7C } + - { offset: 0x17874, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.atan-0', symObjAddr: 0x620, symBinAddr: 0x100032E40, symSize: 0x7C } + - { offset: 0x1787C, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.s_atan-1', symObjAddr: 0x69C, symBinAddr: 0x100032EBC, symSize: 0xD8 } + - { offset: 0x178A8, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.s_atan-1', symObjAddr: 0x69C, symBinAddr: 0x100032EBC, symSize: 0xD8 } + - { offset: 0x178B0, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.x_atan-2', symObjAddr: 0x774, symBinAddr: 0x100032F94, symSize: 0x100 } + - { offset: 0x178DC, size: 0x8, addend: 0x0, symName: '_math::atan2_f64.x_atan-2', symObjAddr: 0x774, symBinAddr: 0x100032F94, symSize: 0x100 } + - { offset: 0x17981, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_alloc', symObjAddr: 0x0, symBinAddr: 0x100033094, symSize: 0x80 } + - { offset: 0x17992, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_alloc', symObjAddr: 0x0, symBinAddr: 0x100033094, symSize: 0x80 } + - { offset: 0x1799A, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_resize', symObjAddr: 0x80, symBinAddr: 0x100033114, symSize: 0x38 } + - { offset: 0x179D2, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_resize', symObjAddr: 0x80, symBinAddr: 0x100033114, symSize: 0x38 } + - { offset: 0x179DA, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_free', symObjAddr: 0xB8, symBinAddr: 0x10003314C, symSize: 0x2C } + - { offset: 0x17A12, size: 0x8, addend: 0x0, symName: '_runtime::[heap_allocator_unix.odin]::_heap_free', symObjAddr: 0xB8, symBinAddr: 0x10003314C, symSize: 0x2C } + - { offset: 0x17A9C, size: 0x8, addend: 0x0, symName: '_rand::shuffle:proc(array:[]int,gen:runtime::Random_Generator)', symObjAddr: 0x0, symBinAddr: 0x100033178, symSize: 0x3A4 } + - { offset: 0x17C4C, size: 0x8, addend: 0x0, symName: '_rand::shuffle:proc(array:[]int,gen:runtime::Random_Generator)', symObjAddr: 0x0, symBinAddr: 0x100033178, symSize: 0x3A4 } + - { offset: 0x17C54, size: 0x8, addend: 0x0, symName: '_rand::shuffle:proc(array:[]card::Card,gen:runtime::Random_Generator)', symObjAddr: 0x3A4, symBinAddr: 0x10003351C, symSize: 0xBA4 } + - { offset: 0x17D18, size: 0x8, addend: 0x0, symName: '_rand::shuffle:proc(array:[]card::Card,gen:runtime::Random_Generator)', symObjAddr: 0x3A4, symBinAddr: 0x10003351C, symSize: 0xBA4 } + - { offset: 0x17D20, size: 0x8, addend: 0x0, symName: '_rand::uint32', symObjAddr: 0xF48, symBinAddr: 0x1000340C0, symSize: 0x64 } + - { offset: 0x17DE4, size: 0x8, addend: 0x0, symName: '_rand::uint32', symObjAddr: 0xF48, symBinAddr: 0x1000340C0, symSize: 0x64 } + - { offset: 0x17DEC, size: 0x8, addend: 0x0, symName: '_rand::uint64', symObjAddr: 0xFAC, symBinAddr: 0x100034124, symSize: 0xA8 } + - { offset: 0x17E36, size: 0x8, addend: 0x0, symName: '_rand::uint64', symObjAddr: 0xFAC, symBinAddr: 0x100034124, symSize: 0xA8 } + - { offset: 0x17E3E, size: 0x8, addend: 0x0, symName: '_rand::int31', symObjAddr: 0x1054, symBinAddr: 0x1000341CC, symSize: 0x8C } + - { offset: 0x17E90, size: 0x8, addend: 0x0, symName: '_rand::int31', symObjAddr: 0x1054, symBinAddr: 0x1000341CC, symSize: 0x8C } + - { offset: 0x17EAA, size: 0x8, addend: 0x0, symName: '_rand::int31', symObjAddr: 0x1054, symBinAddr: 0x1000341CC, symSize: 0x8C } + - { offset: 0x17EB2, size: 0x8, addend: 0x0, symName: '_rand::int63', symObjAddr: 0x10E0, symBinAddr: 0x100034258, symSize: 0x8C } + - { offset: 0x17EFC, size: 0x8, addend: 0x0, symName: '_rand::int63', symObjAddr: 0x10E0, symBinAddr: 0x100034258, symSize: 0x8C } + - { offset: 0x17F04, size: 0x8, addend: 0x0, symName: '_rand::int31_max', symObjAddr: 0x116C, symBinAddr: 0x1000342E4, symSize: 0x1CC } + - { offset: 0x17F4E, size: 0x8, addend: 0x0, symName: '_rand::int31_max', symObjAddr: 0x116C, symBinAddr: 0x1000342E4, symSize: 0x1CC } + - { offset: 0x17F56, size: 0x8, addend: 0x0, symName: '_rand::int63_max', symObjAddr: 0x1338, symBinAddr: 0x1000344B0, symSize: 0x1CC } + - { offset: 0x17FBC, size: 0x8, addend: 0x0, symName: '_rand::int63_max', symObjAddr: 0x1338, symBinAddr: 0x1000344B0, symSize: 0x1CC } + - { offset: 0x17FE9, size: 0x8, addend: 0x0, symName: '_rand::int63_max', symObjAddr: 0x1338, symBinAddr: 0x1000344B0, symSize: 0x1CC } + - { offset: 0x17FF1, size: 0x8, addend: 0x0, symName: '_rand::float32', symObjAddr: 0x1504, symBinAddr: 0x10003467C, symSize: 0x70 } + - { offset: 0x18058, size: 0x8, addend: 0x0, symName: '_rand::float32', symObjAddr: 0x1504, symBinAddr: 0x10003467C, symSize: 0x70 } + - { offset: 0x18085, size: 0x8, addend: 0x0, symName: '_rand::float32', symObjAddr: 0x1504, symBinAddr: 0x10003467C, symSize: 0x70 } + - { offset: 0x1808D, size: 0x8, addend: 0x0, symName: '_rand::float32_range', symObjAddr: 0x1574, symBinAddr: 0x1000346EC, symSize: 0x128 } + - { offset: 0x180DB, size: 0x8, addend: 0x0, symName: '_rand::float32_range', symObjAddr: 0x1574, symBinAddr: 0x1000346EC, symSize: 0x128 } + - { offset: 0x186D6, size: 0x8, addend: 0x0, symName: '_runtime::[default_temporary_allocator.odin]::_destroy_temp_allocator_fini', symObjAddr: 0x0, symBinAddr: 0x100034814, symSize: 0x34 } + - { offset: 0x187FC, size: 0x8, addend: 0x0, symName: '_runtime::[default_temporary_allocator.odin]::_destroy_temp_allocator_fini', symObjAddr: 0x0, symBinAddr: 0x100034814, symSize: 0x34 } + - { offset: 0x18804, size: 0x8, addend: 0x0, symName: '_runtime::default_temp_allocator_destroy', symObjAddr: 0x34, symBinAddr: 0x100034848, symSize: 0x60 } + - { offset: 0x1881B, size: 0x8, addend: 0x0, symName: '_runtime::default_temp_allocator_destroy', symObjAddr: 0x34, symBinAddr: 0x100034848, symSize: 0x60 } + - { offset: 0x18823, size: 0x8, addend: 0x0, symName: '_runtime::default_temp_allocator_proc', symObjAddr: 0x94, symBinAddr: 0x1000348A8, symSize: 0xD0 } + - { offset: 0x18849, size: 0x8, addend: 0x0, symName: '_runtime::default_temp_allocator_proc', symObjAddr: 0x94, symBinAddr: 0x1000348A8, symSize: 0xD0 } + - { offset: 0x18D7F, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::byte_slice', symObjAddr: 0x0, symBinAddr: 0x100034978, symSize: 0x48 } + - { offset: 0x18ED7, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::byte_slice', symObjAddr: 0x0, symBinAddr: 0x100034978, symSize: 0x48 } + - { offset: 0x18EDF, size: 0x8, addend: 0x0, symName: '_runtime::align_forward_uint', symObjAddr: 0x48, symBinAddr: 0x1000349C0, symSize: 0x84 } + - { offset: 0x18F17, size: 0x8, addend: 0x0, symName: '_runtime::align_forward_uint', symObjAddr: 0x48, symBinAddr: 0x1000349C0, symSize: 0x84 } + - { offset: 0x18F1F, size: 0x8, addend: 0x0, symName: '_runtime::align_forward_uintptr', symObjAddr: 0xCC, symBinAddr: 0x100034A44, symSize: 0x3C } + - { offset: 0x18F67, size: 0x8, addend: 0x0, symName: '_runtime::align_forward_uintptr', symObjAddr: 0xCC, symBinAddr: 0x100034A44, symSize: 0x3C } + - { offset: 0x18F6F, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_int', symObjAddr: 0x108, symBinAddr: 0x100034A80, symSize: 0x48 } + - { offset: 0x18FB7, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_int', symObjAddr: 0x108, symBinAddr: 0x100034A80, symSize: 0x48 } + - { offset: 0x18FBF, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_uint', symObjAddr: 0x150, symBinAddr: 0x100034AC8, symSize: 0x48 } + - { offset: 0x18FE9, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_uint', symObjAddr: 0x150, symBinAddr: 0x100034AC8, symSize: 0x48 } + - { offset: 0x18FF1, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_uintptr', symObjAddr: 0x198, symBinAddr: 0x100034B10, symSize: 0x28 } + - { offset: 0x1901B, size: 0x8, addend: 0x0, symName: '_runtime::is_power_of_two_uintptr', symObjAddr: 0x198, symBinAddr: 0x100034B10, symSize: 0x28 } + - { offset: 0x19023, size: 0x8, addend: 0x0, symName: '_runtime::mem_copy_non_overlapping', symObjAddr: 0x1C0, symBinAddr: 0x100034B38, symSize: 0x94 } + - { offset: 0x1904D, size: 0x8, addend: 0x0, symName: '_runtime::mem_copy_non_overlapping', symObjAddr: 0x1C0, symBinAddr: 0x100034B38, symSize: 0x94 } + - { offset: 0x19055, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc_bytes', symObjAddr: 0x254, symBinAddr: 0x100034BCC, symSize: 0x110 } + - { offset: 0x1909B, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc_bytes', symObjAddr: 0x254, symBinAddr: 0x100034BCC, symSize: 0x110 } + - { offset: 0x190A3, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc', symObjAddr: 0x364, symBinAddr: 0x100034CDC, symSize: 0x110 } + - { offset: 0x1910B, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc', symObjAddr: 0x364, symBinAddr: 0x100034CDC, symSize: 0x110 } + - { offset: 0x19113, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc_non_zeroed', symObjAddr: 0x474, symBinAddr: 0x100034DEC, symSize: 0x110 } + - { offset: 0x1917B, size: 0x8, addend: 0x0, symName: '_runtime::mem_alloc_non_zeroed', symObjAddr: 0x474, symBinAddr: 0x100034DEC, symSize: 0x110 } + - { offset: 0x19183, size: 0x8, addend: 0x0, symName: '_runtime::mem_free', symObjAddr: 0x584, symBinAddr: 0x100034EFC, symSize: 0xAC } + - { offset: 0x191EB, size: 0x8, addend: 0x0, symName: '_runtime::mem_free', symObjAddr: 0x584, symBinAddr: 0x100034EFC, symSize: 0xAC } + - { offset: 0x191F3, size: 0x8, addend: 0x0, symName: '_runtime::mem_free_with_size', symObjAddr: 0x630, symBinAddr: 0x100034FA8, symSize: 0xB8 } + - { offset: 0x19253, size: 0x8, addend: 0x0, symName: '_runtime::mem_free_with_size', symObjAddr: 0x630, symBinAddr: 0x100034FA8, symSize: 0xB8 } + - { offset: 0x1926D, size: 0x8, addend: 0x0, symName: '_runtime::mem_free_with_size', symObjAddr: 0x630, symBinAddr: 0x100034FA8, symSize: 0xB8 } + - { offset: 0x19275, size: 0x8, addend: 0x0, symName: '_runtime::_mem_resize', symObjAddr: 0x6E8, symBinAddr: 0x100035060, symSize: 0x644 } + - { offset: 0x192E4, size: 0x8, addend: 0x0, symName: '_runtime::_mem_resize', symObjAddr: 0x6E8, symBinAddr: 0x100035060, symSize: 0x644 } + - { offset: 0x192FE, size: 0x8, addend: 0x0, symName: '_runtime::_mem_resize', symObjAddr: 0x6E8, symBinAddr: 0x100035060, symSize: 0x644 } + - { offset: 0x19306, size: 0x8, addend: 0x0, symName: '_runtime::mem_resize', symObjAddr: 0xD2C, symBinAddr: 0x1000356A4, symSize: 0x148 } + - { offset: 0x193BB, size: 0x8, addend: 0x0, symName: '_runtime::mem_resize', symObjAddr: 0xD2C, symBinAddr: 0x1000356A4, symSize: 0x148 } + - { offset: 0x193C3, size: 0x8, addend: 0x0, symName: '_runtime::non_zero_mem_resize', symObjAddr: 0xE74, symBinAddr: 0x1000357EC, symSize: 0x14C } + - { offset: 0x19469, size: 0x8, addend: 0x0, symName: '_runtime::non_zero_mem_resize', symObjAddr: 0xE74, symBinAddr: 0x1000357EC, symSize: 0x14C } + - { offset: 0x19471, size: 0x8, addend: 0x0, symName: '_runtime::conditional_mem_zero', symObjAddr: 0xFC0, symBinAddr: 0x100035938, symSize: 0x154 } + - { offset: 0x19517, size: 0x8, addend: 0x0, symName: '_runtime::conditional_mem_zero', symObjAddr: 0xFC0, symBinAddr: 0x100035938, symSize: 0x154 } + - { offset: 0x1951F, size: 0x8, addend: 0x0, symName: '_runtime::memory_equal', symObjAddr: 0x1114, symBinAddr: 0x100035A8C, symSize: 0x2B4 } + - { offset: 0x195CE, size: 0x8, addend: 0x0, symName: '_runtime::memory_equal', symObjAddr: 0x1114, symBinAddr: 0x100035A8C, symSize: 0x2B4 } + - { offset: 0x195D6, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare', symObjAddr: 0x13C8, symBinAddr: 0x100035D40, symSize: 0x4A4 } + - { offset: 0x1962A, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare', symObjAddr: 0x13C8, symBinAddr: 0x100035D40, symSize: 0x4A4 } + - { offset: 0x196CE, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare', symObjAddr: 0x13C8, symBinAddr: 0x100035D40, symSize: 0x4A4 } + - { offset: 0x196D6, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare_zero', symObjAddr: 0x186C, symBinAddr: 0x1000361E4, symSize: 0x240 } + - { offset: 0x1972A, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare_zero', symObjAddr: 0x186C, symBinAddr: 0x1000361E4, symSize: 0x240 } + - { offset: 0x198C0, size: 0x8, addend: 0x0, symName: '_runtime::memory_compare_zero', symObjAddr: 0x186C, symBinAddr: 0x1000361E4, symSize: 0x240 } + - { offset: 0x198C8, size: 0x8, addend: 0x0, symName: '_runtime::string_eq', symObjAddr: 0x1AAC, symBinAddr: 0x100036424, symSize: 0xA0 } + - { offset: 0x1990C, size: 0x8, addend: 0x0, symName: '_runtime::string_eq', symObjAddr: 0x1AAC, symBinAddr: 0x100036424, symSize: 0xA0 } + - { offset: 0x199B2, size: 0x8, addend: 0x0, symName: '_runtime::string_eq', symObjAddr: 0x1AAC, symBinAddr: 0x100036424, symSize: 0xA0 } + - { offset: 0x199BA, size: 0x8, addend: 0x0, symName: '_runtime::string_ne', symObjAddr: 0x1B4C, symBinAddr: 0x1000364C4, symSize: 0x84 } + - { offset: 0x199FE, size: 0x8, addend: 0x0, symName: '_runtime::string_ne', symObjAddr: 0x1B4C, symBinAddr: 0x1000364C4, symSize: 0x84 } + - { offset: 0x19A29, size: 0x8, addend: 0x0, symName: '_runtime::string_ne', symObjAddr: 0x1B4C, symBinAddr: 0x1000364C4, symSize: 0x84 } + - { offset: 0x19A31, size: 0x8, addend: 0x0, symName: '_runtime::cstring_len', symObjAddr: 0x1BD0, symBinAddr: 0x100036548, symSize: 0x74 } + - { offset: 0x19A6E, size: 0x8, addend: 0x0, symName: '_runtime::cstring_len', symObjAddr: 0x1BD0, symBinAddr: 0x100036548, symSize: 0x74 } + - { offset: 0x19A76, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_len', symObjAddr: 0x1C44, symBinAddr: 0x1000365BC, symSize: 0x80 } + - { offset: 0x19AA9, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_len', symObjAddr: 0x1C44, symBinAddr: 0x1000365BC, symSize: 0x80 } + - { offset: 0x19AD4, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_len', symObjAddr: 0x1C44, symBinAddr: 0x1000365BC, symSize: 0x80 } + - { offset: 0x19ADC, size: 0x8, addend: 0x0, symName: '_runtime::cstring_to_string', symObjAddr: 0x1CC4, symBinAddr: 0x10003663C, symSize: 0x98 } + - { offset: 0x19B0F, size: 0x8, addend: 0x0, symName: '_runtime::cstring_to_string', symObjAddr: 0x1CC4, symBinAddr: 0x10003663C, symSize: 0x98 } + - { offset: 0x19B3A, size: 0x8, addend: 0x0, symName: '_runtime::cstring_to_string', symObjAddr: 0x1CC4, symBinAddr: 0x10003663C, symSize: 0x98 } + - { offset: 0x19B42, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_to_string16', symObjAddr: 0x1D5C, symBinAddr: 0x1000366D4, symSize: 0x98 } + - { offset: 0x19B76, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_to_string16', symObjAddr: 0x1D5C, symBinAddr: 0x1000366D4, symSize: 0x98 } + - { offset: 0x19BA1, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_to_string16', symObjAddr: 0x1D5C, symBinAddr: 0x1000366D4, symSize: 0x98 } + - { offset: 0x19BA9, size: 0x8, addend: 0x0, symName: '_runtime::cstring_eq', symObjAddr: 0x1DF4, symBinAddr: 0x10003676C, symSize: 0xF0 } + - { offset: 0x19BDD, size: 0x8, addend: 0x0, symName: '_runtime::cstring_eq', symObjAddr: 0x1DF4, symBinAddr: 0x10003676C, symSize: 0xF0 } + - { offset: 0x19C08, size: 0x8, addend: 0x0, symName: '_runtime::cstring_eq', symObjAddr: 0x1DF4, symBinAddr: 0x10003676C, symSize: 0xF0 } + - { offset: 0x19C10, size: 0x8, addend: 0x0, symName: '_runtime::cstring_ne', symObjAddr: 0x1EE4, symBinAddr: 0x10003685C, symSize: 0x44 } + - { offset: 0x19C52, size: 0x8, addend: 0x0, symName: '_runtime::cstring_ne', symObjAddr: 0x1EE4, symBinAddr: 0x10003685C, symSize: 0x44 } + - { offset: 0x19C9D, size: 0x8, addend: 0x0, symName: '_runtime::cstring_ne', symObjAddr: 0x1EE4, symBinAddr: 0x10003685C, symSize: 0x44 } + - { offset: 0x19CA5, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_eq', symObjAddr: 0x1F28, symBinAddr: 0x1000368A0, symSize: 0xF4 } + - { offset: 0x19CE0, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_eq', symObjAddr: 0x1F28, symBinAddr: 0x1000368A0, symSize: 0xF4 } + - { offset: 0x19CE8, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_ne', symObjAddr: 0x201C, symBinAddr: 0x100036994, symSize: 0x44 } + - { offset: 0x19D2A, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_ne', symObjAddr: 0x201C, symBinAddr: 0x100036994, symSize: 0x44 } + - { offset: 0x19D75, size: 0x8, addend: 0x0, symName: '_runtime::cstring16_ne', symObjAddr: 0x201C, symBinAddr: 0x100036994, symSize: 0x44 } + - { offset: 0x19D7D, size: 0x8, addend: 0x0, symName: '_runtime::string_decode_rune', symObjAddr: 0x2060, symBinAddr: 0x1000369D8, symSize: 0x408 } + - { offset: 0x19DB8, size: 0x8, addend: 0x0, symName: '_runtime::string_decode_rune', symObjAddr: 0x2060, symBinAddr: 0x1000369D8, symSize: 0x408 } + - { offset: 0x19DC0, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f32_to_f16', symObjAddr: 0x2468, symBinAddr: 0x100036DE0, symSize: 0x250 } + - { offset: 0x19DF4, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f32_to_f16', symObjAddr: 0x2468, symBinAddr: 0x100036DE0, symSize: 0x250 } + - { offset: 0x19EA9, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f32_to_f16', symObjAddr: 0x2468, symBinAddr: 0x100036DE0, symSize: 0x250 } + - { offset: 0x19EB1, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f16_to_f32', symObjAddr: 0x26B8, symBinAddr: 0x100037030, symSize: 0xA0 } + - { offset: 0x19EE5, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f16_to_f32', symObjAddr: 0x26B8, symBinAddr: 0x100037030, symSize: 0xA0 } + - { offset: 0x19FAB, size: 0x8, addend: 0x0, symName: '_runtime::[internal.odin]::f16_to_f32', symObjAddr: 0x26B8, symBinAddr: 0x100037030, symSize: 0xA0 } + - { offset: 0x19FB3, size: 0x8, addend: 0x0, symName: ___truncsfhf2, symObjAddr: 0x2758, symBinAddr: 0x1000370D0, symSize: 0x28 } + - { offset: 0x19FE6, size: 0x8, addend: 0x0, symName: ___truncsfhf2, symObjAddr: 0x2758, symBinAddr: 0x1000370D0, symSize: 0x28 } + - { offset: 0x1A031, size: 0x8, addend: 0x0, symName: ___truncsfhf2, symObjAddr: 0x2758, symBinAddr: 0x1000370D0, symSize: 0x28 } + - { offset: 0x1A039, size: 0x8, addend: 0x0, symName: ___gnu_f2h_ieee, symObjAddr: 0x2780, symBinAddr: 0x1000370F8, symSize: 0x28 } + - { offset: 0x1A065, size: 0x8, addend: 0x0, symName: ___gnu_f2h_ieee, symObjAddr: 0x2780, symBinAddr: 0x1000370F8, symSize: 0x28 } + - { offset: 0x1A06D, size: 0x8, addend: 0x0, symName: ___truncdfhf2, symObjAddr: 0x27A8, symBinAddr: 0x100037120, symSize: 0x2C } + - { offset: 0x1A099, size: 0x8, addend: 0x0, symName: ___truncdfhf2, symObjAddr: 0x27A8, symBinAddr: 0x100037120, symSize: 0x2C } + - { offset: 0x1A0A1, size: 0x8, addend: 0x0, symName: ___gnu_h2f_ieee, symObjAddr: 0x27D4, symBinAddr: 0x10003714C, symSize: 0x28 } + - { offset: 0x1A0CD, size: 0x8, addend: 0x0, symName: ___gnu_h2f_ieee, symObjAddr: 0x27D4, symBinAddr: 0x10003714C, symSize: 0x28 } + - { offset: 0x1A0D5, size: 0x8, addend: 0x0, symName: ___extendhfsf2, symObjAddr: 0x27FC, symBinAddr: 0x100037174, symSize: 0x28 } + - { offset: 0x1A101, size: 0x8, addend: 0x0, symName: ___extendhfsf2, symObjAddr: 0x27FC, symBinAddr: 0x100037174, symSize: 0x28 } + - { offset: 0x1A68F, size: 0x8, addend: 0x0, symName: '_runtime::[random_generator_chacha8_simd128.odin]::chacha8rand_refill_simd128', symObjAddr: 0x0, symBinAddr: 0x10003719C, symSize: 0xCB4 } + - { offset: 0x1A6C7, size: 0x8, addend: 0x0, symName: '_runtime::[random_generator_chacha8_simd128.odin]::chacha8rand_refill_simd128', symObjAddr: 0x0, symBinAddr: 0x10003719C, symSize: 0xCB4 } + - { offset: 0x1A6CF, size: 0x8, addend: 0x0, symName: '__proclit$anon-1', symObjAddr: 0xCB4, symBinAddr: 0x100037E50, symSize: 0x43C } + - { offset: 0x1AAAC, size: 0x8, addend: 0x0, symName: '__proclit$anon-1', symObjAddr: 0xCB4, symBinAddr: 0x100037E50, symSize: 0x43C } + - { offset: 0x1AC4C, size: 0x8, addend: 0x0, symName: '_runtime::add_thread_local_cleaner', symObjAddr: 0x0, symBinAddr: 0x10003828C, symSize: 0xD4 } + - { offset: 0x1AD47, size: 0x8, addend: 0x0, symName: '_runtime::add_thread_local_cleaner', symObjAddr: 0x0, symBinAddr: 0x10003828C, symSize: 0xD4 } + - { offset: 0x1B1BE, size: 0x8, addend: 0x0, symName: '_reflect::type_kind', symObjAddr: 0x0, symBinAddr: 0x100038360, symSize: 0x430 } + - { offset: 0x1B56B, size: 0x8, addend: 0x0, symName: '_reflect::type_kind', symObjAddr: 0x0, symBinAddr: 0x100038360, symSize: 0x430 } + - { offset: 0x1B573, size: 0x8, addend: 0x0, symName: '_reflect::is_unsigned', symObjAddr: 0x430, symBinAddr: 0x100038790, symSize: 0xC4 } + - { offset: 0x1B5A5, size: 0x8, addend: 0x0, symName: '_reflect::is_unsigned', symObjAddr: 0x430, symBinAddr: 0x100038790, symSize: 0xC4 } + - { offset: 0x1B5C0, size: 0x8, addend: 0x0, symName: '_reflect::is_unsigned', symObjAddr: 0x430, symBinAddr: 0x100038790, symSize: 0xC4 } + - { offset: 0x1B5C8, size: 0x8, addend: 0x0, symName: '_reflect::is_rune', symObjAddr: 0x4F4, symBinAddr: 0x100038854, symSize: 0x74 } + - { offset: 0x1B613, size: 0x8, addend: 0x0, symName: '_reflect::is_rune', symObjAddr: 0x4F4, symBinAddr: 0x100038854, symSize: 0x74 } + - { offset: 0x1B61B, size: 0x8, addend: 0x0, symName: '_reflect::is_any', symObjAddr: 0x568, symBinAddr: 0x1000388C8, symSize: 0x74 } + - { offset: 0x1B64C, size: 0x8, addend: 0x0, symName: '_reflect::is_any', symObjAddr: 0x568, symBinAddr: 0x1000388C8, symSize: 0x74 } + - { offset: 0x1B666, size: 0x8, addend: 0x0, symName: '_reflect::is_any', symObjAddr: 0x568, symBinAddr: 0x1000388C8, symSize: 0x74 } + - { offset: 0x1B66E, size: 0x8, addend: 0x0, symName: '_reflect::is_string', symObjAddr: 0x5DC, symBinAddr: 0x10003893C, symSize: 0x74 } + - { offset: 0x1B6A1, size: 0x8, addend: 0x0, symName: '_reflect::is_string', symObjAddr: 0x5DC, symBinAddr: 0x10003893C, symSize: 0x74 } + - { offset: 0x1B6BC, size: 0x8, addend: 0x0, symName: '_reflect::is_string', symObjAddr: 0x5DC, symBinAddr: 0x10003893C, symSize: 0x74 } + - { offset: 0x1B6C4, size: 0x8, addend: 0x0, symName: '_reflect::is_pointer_internally', symObjAddr: 0x650, symBinAddr: 0x1000389B0, symSize: 0xD0 } + - { offset: 0x1B6F7, size: 0x8, addend: 0x0, symName: '_reflect::is_pointer_internally', symObjAddr: 0x650, symBinAddr: 0x1000389B0, symSize: 0xD0 } + - { offset: 0x1B712, size: 0x8, addend: 0x0, symName: '_reflect::is_pointer_internally', symObjAddr: 0x650, symBinAddr: 0x1000389B0, symSize: 0xD0 } + - { offset: 0x1B71A, size: 0x8, addend: 0x0, symName: '_reflect::is_raw_union', symObjAddr: 0x720, symBinAddr: 0x100038A80, symSize: 0x144 } + - { offset: 0x1B78C, size: 0x8, addend: 0x0, symName: '_reflect::is_raw_union', symObjAddr: 0x720, symBinAddr: 0x100038A80, symSize: 0x144 } + - { offset: 0x1B794, size: 0x8, addend: 0x0, symName: '_reflect::is_enum', symObjAddr: 0x864, symBinAddr: 0x100038BC4, symSize: 0x74 } + - { offset: 0x1B7C8, size: 0x8, addend: 0x0, symName: '_reflect::is_enum', symObjAddr: 0x864, symBinAddr: 0x100038BC4, symSize: 0x74 } + - { offset: 0x1B7F5, size: 0x8, addend: 0x0, symName: '_reflect::is_enum', symObjAddr: 0x864, symBinAddr: 0x100038BC4, symSize: 0x74 } + - { offset: 0x1B7FD, size: 0x8, addend: 0x0, symName: '_reflect::struct_field_value_by_name', symObjAddr: 0x8D8, symBinAddr: 0x100038C38, symSize: 0x420 } + - { offset: 0x1B830, size: 0x8, addend: 0x0, symName: '_reflect::struct_field_value_by_name', symObjAddr: 0x8D8, symBinAddr: 0x100038C38, symSize: 0x420 } + - { offset: 0x1B84B, size: 0x8, addend: 0x0, symName: '_reflect::struct_field_value_by_name', symObjAddr: 0x8D8, symBinAddr: 0x100038C38, symSize: 0x420 } + - { offset: 0x1B853, size: 0x8, addend: 0x0, symName: '_reflect::is_endian_big', symObjAddr: 0xCF8, symBinAddr: 0x100039058, symSize: 0x190 } + - { offset: 0x1B8B8, size: 0x8, addend: 0x0, symName: '_reflect::is_endian_big', symObjAddr: 0xCF8, symBinAddr: 0x100039058, symSize: 0x190 } + - { offset: 0x1B982, size: 0x8, addend: 0x0, symName: '_reflect::is_endian_big', symObjAddr: 0xCF8, symBinAddr: 0x100039058, symSize: 0x190 } + - { offset: 0x1B98A, size: 0x8, addend: 0x0, symName: '_reflect::write_typeid_writer', symObjAddr: 0xE88, symBinAddr: 0x1000391E8, symSize: 0xB8 } + - { offset: 0x1B9CF, size: 0x8, addend: 0x0, symName: '_reflect::write_typeid_writer', symObjAddr: 0xE88, symBinAddr: 0x1000391E8, symSize: 0xB8 } + - { offset: 0x1BA0D, size: 0x8, addend: 0x0, symName: '_reflect::write_typeid_writer', symObjAddr: 0xE88, symBinAddr: 0x1000391E8, symSize: 0xB8 } + - { offset: 0x1BA15, size: 0x8, addend: 0x0, symName: '_reflect::write_type_writer', symObjAddr: 0xF40, symBinAddr: 0x1000392A0, symSize: 0x7C4C } + - { offset: 0x1BA95, size: 0x8, addend: 0x0, symName: '_reflect::write_type_writer', symObjAddr: 0xF40, symBinAddr: 0x1000392A0, symSize: 0x7C4C } + - { offset: 0x1BA9D, size: 0x8, addend: 0x0, symName: '_reflect::struct_tag_lookup', symObjAddr: 0x8B8C, symBinAddr: 0x100040EEC, symSize: 0x6B4 } + - { offset: 0x1BC83, size: 0x8, addend: 0x0, symName: '_reflect::struct_tag_lookup', symObjAddr: 0x8B8C, symBinAddr: 0x100040EEC, symSize: 0x6B4 } + - { offset: 0x1BC8B, size: 0x8, addend: 0x0, symName: '_reflect::enum_string', symObjAddr: 0x9240, symBinAddr: 0x1000415A0, symSize: 0x288 } + - { offset: 0x1BD73, size: 0x8, addend: 0x0, symName: '_reflect::enum_string', symObjAddr: 0x9240, symBinAddr: 0x1000415A0, symSize: 0x288 } + - { offset: 0x1BD7B, size: 0x8, addend: 0x0, symName: '_reflect::enum_name_from_value_any', symObjAddr: 0x94C8, symBinAddr: 0x100041828, symSize: 0x3AC } + - { offset: 0x1BDC0, size: 0x8, addend: 0x0, symName: '_reflect::enum_name_from_value_any', symObjAddr: 0x94C8, symBinAddr: 0x100041828, symSize: 0x3AC } + - { offset: 0x1BE67, size: 0x8, addend: 0x0, symName: '_reflect::enum_name_from_value_any', symObjAddr: 0x94C8, symBinAddr: 0x100041828, symSize: 0x3AC } + - { offset: 0x1BE6F, size: 0x8, addend: 0x0, symName: '_reflect::type_info_union_is_pure_maybe', symObjAddr: 0x9874, symBinAddr: 0x100041BD4, symSize: 0xA4 } + - { offset: 0x1BED6, size: 0x8, addend: 0x0, symName: '_reflect::type_info_union_is_pure_maybe', symObjAddr: 0x9874, symBinAddr: 0x100041BD4, symSize: 0xA4 } + - { offset: 0x1BF48, size: 0x8, addend: 0x0, symName: '_reflect::type_info_union_is_pure_maybe', symObjAddr: 0x9874, symBinAddr: 0x100041BD4, symSize: 0xA4 } + - { offset: 0x1BF50, size: 0x8, addend: 0x0, symName: '_reflect::as_bool', symObjAddr: 0x9918, symBinAddr: 0x100041C78, symSize: 0x260 } + - { offset: 0x1BF8E, size: 0x8, addend: 0x0, symName: '_reflect::as_bool', symObjAddr: 0x9918, symBinAddr: 0x100041C78, symSize: 0x260 } + - { offset: 0x1BF96, size: 0x8, addend: 0x0, symName: '_reflect::as_int', symObjAddr: 0x9B78, symBinAddr: 0x100041ED8, symSize: 0xA0 } + - { offset: 0x1BFEC, size: 0x8, addend: 0x0, symName: '_reflect::as_int', symObjAddr: 0x9B78, symBinAddr: 0x100041ED8, symSize: 0xA0 } + - { offset: 0x1C082, size: 0x8, addend: 0x0, symName: '_reflect::as_int', symObjAddr: 0x9B78, symBinAddr: 0x100041ED8, symSize: 0xA0 } + - { offset: 0x1C08A, size: 0x8, addend: 0x0, symName: '_reflect::as_i64', symObjAddr: 0x9C18, symBinAddr: 0x100041F78, symSize: 0xE3C } + - { offset: 0x1C0F1, size: 0x8, addend: 0x0, symName: '_reflect::as_i64', symObjAddr: 0x9C18, symBinAddr: 0x100041F78, symSize: 0xE3C } + - { offset: 0x1C10D, size: 0x8, addend: 0x0, symName: '_reflect::as_i64', symObjAddr: 0x9C18, symBinAddr: 0x100041F78, symSize: 0xE3C } + - { offset: 0x1D164, size: 0x8, addend: 0x0, symName: '_utf16::decode_surrogate_pair', symObjAddr: 0x0, symBinAddr: 0x100042DB4, symSize: 0xC4 } + - { offset: 0x1D1D9, size: 0x8, addend: 0x0, symName: '_utf16::decode_surrogate_pair', symObjAddr: 0x0, symBinAddr: 0x100042DB4, symSize: 0xC4 } + - { offset: 0x1D1E1, size: 0x8, addend: 0x0, symName: '_utf16::encode_surrogate_pair', symObjAddr: 0xC4, symBinAddr: 0x100042E78, symSize: 0xB4 } + - { offset: 0x1D219, size: 0x8, addend: 0x0, symName: '_utf16::encode_surrogate_pair', symObjAddr: 0xC4, symBinAddr: 0x100042E78, symSize: 0xB4 } + - { offset: 0x1D221, size: 0x8, addend: 0x0, symName: '_utf16::encode', symObjAddr: 0x178, symBinAddr: 0x100042F2C, symSize: 0x304 } + - { offset: 0x1D270, size: 0x8, addend: 0x0, symName: '_utf16::encode', symObjAddr: 0x178, symBinAddr: 0x100042F2C, symSize: 0x304 } + - { offset: 0x1D28A, size: 0x8, addend: 0x0, symName: '_utf16::encode', symObjAddr: 0x178, symBinAddr: 0x100042F2C, symSize: 0x304 } + - { offset: 0x1D292, size: 0x8, addend: 0x0, symName: '_utf16::decode_rune_in_string', symObjAddr: 0x47C, symBinAddr: 0x100043230, symSize: 0x2C4 } + - { offset: 0x1D2E2, size: 0x8, addend: 0x0, symName: '_utf16::decode_rune_in_string', symObjAddr: 0x47C, symBinAddr: 0x100043230, symSize: 0x2C4 } + - { offset: 0x1D361, size: 0x8, addend: 0x0, symName: '_utf16::decode_rune_in_string', symObjAddr: 0x47C, symBinAddr: 0x100043230, symSize: 0x2C4 } + - { offset: 0x1D4C5, size: 0x8, addend: 0x0, symName: '_assets::codepoints_for', symObjAddr: 0x0, symBinAddr: 0x1000434F4, symSize: 0x644 } + - { offset: 0x1D6B8, size: 0x8, addend: 0x0, symName: '_assets::codepoints_for', symObjAddr: 0x0, symBinAddr: 0x1000434F4, symSize: 0x644 } + - { offset: 0x1D6C0, size: 0x8, addend: 0x0, symName: '_assets::[assets.odin]::load_font', symObjAddr: 0x644, symBinAddr: 0x100043B38, symSize: 0x2FC } + - { offset: 0x1D712, size: 0x8, addend: 0x0, symName: '_assets::[assets.odin]::load_font', symObjAddr: 0x644, symBinAddr: 0x100043B38, symSize: 0x2FC } + - { offset: 0x1D7F3, size: 0x8, addend: 0x0, symName: '_assets::[assets.odin]::load_font', symObjAddr: 0x644, symBinAddr: 0x100043B38, symSize: 0x2FC } + - { offset: 0x1D7FB, size: 0x8, addend: 0x0, symName: '_assets::load_fonts', symObjAddr: 0x940, symBinAddr: 0x100043E34, symSize: 0x13C } + - { offset: 0x1D83E, size: 0x8, addend: 0x0, symName: '_assets::load_fonts', symObjAddr: 0x940, symBinAddr: 0x100043E34, symSize: 0x13C } + - { offset: 0x1D879, size: 0x8, addend: 0x0, symName: '_assets::load_fonts', symObjAddr: 0x940, symBinAddr: 0x100043E34, symSize: 0x13C } + - { offset: 0x1D881, size: 0x8, addend: 0x0, symName: '_assets::unload_fonts', symObjAddr: 0xA7C, symBinAddr: 0x100043F70, symSize: 0x154 } + - { offset: 0x1D8CB, size: 0x8, addend: 0x0, symName: '_assets::unload_fonts', symObjAddr: 0xA7C, symBinAddr: 0x100043F70, symSize: 0x154 } + - { offset: 0x1D8D3, size: 0x8, addend: 0x0, symName: '_assets::get_font', symObjAddr: 0xBD0, symBinAddr: 0x1000440C4, symSize: 0x84 } + - { offset: 0x1D92F, size: 0x8, addend: 0x0, symName: '_assets::get_font', symObjAddr: 0xBD0, symBinAddr: 0x1000440C4, symSize: 0x84 } + - { offset: 0x1DF09, size: 0x8, addend: 0x0, symName: '_runtime::stderr_write', symObjAddr: 0x0, symBinAddr: 0x100044148, symSize: 0x6C } + - { offset: 0x1DF36, size: 0x8, addend: 0x0, symName: '_runtime::stderr_write', symObjAddr: 0x0, symBinAddr: 0x100044148, symSize: 0x6C } + - { offset: 0x1DF3E, size: 0x8, addend: 0x0, symName: '_runtime::rand_bytes', symObjAddr: 0x6C, symBinAddr: 0x1000441B4, symSize: 0x4C } + - { offset: 0x1DF69, size: 0x8, addend: 0x0, symName: '_runtime::rand_bytes', symObjAddr: 0x6C, symBinAddr: 0x1000441B4, symSize: 0x4C } + - { offset: 0x1E00C, size: 0x8, addend: 0x0, symName: '_runtime::udivmod128', symObjAddr: 0x0, symBinAddr: 0x100044200, symSize: 0x9A0 } + - { offset: 0x1E01D, size: 0x8, addend: 0x0, symName: '_runtime::udivmod128', symObjAddr: 0x0, symBinAddr: 0x100044200, symSize: 0x9A0 } + - { offset: 0x1E1C0, size: 0x8, addend: 0x0, symName: '_time::date', symObjAddr: 0x0, symBinAddr: 0x100044BA0, symSize: 0xAC } + - { offset: 0x1E49A, size: 0x8, addend: 0x0, symName: '_time::date', symObjAddr: 0x0, symBinAddr: 0x100044BA0, symSize: 0xAC } + - { offset: 0x1E4A2, size: 0x8, addend: 0x0, symName: '_time::clock_from_time', symObjAddr: 0xAC, symBinAddr: 0x100044C4C, symSize: 0xA0 } + - { offset: 0x1E501, size: 0x8, addend: 0x0, symName: '_time::clock_from_time', symObjAddr: 0xAC, symBinAddr: 0x100044C4C, symSize: 0xA0 } + - { offset: 0x1E509, size: 0x8, addend: 0x0, symName: '_time::precise_clock_from_time', symObjAddr: 0x14C, symBinAddr: 0x100044CEC, symSize: 0x128 } + - { offset: 0x1E568, size: 0x8, addend: 0x0, symName: '_time::precise_clock_from_time', symObjAddr: 0x14C, symBinAddr: 0x100044CEC, symSize: 0x128 } + - { offset: 0x1E570, size: 0x8, addend: 0x0, symName: '_time::[time.odin]::_time_abs', symObjAddr: 0x274, symBinAddr: 0x100044E14, symSize: 0x3C } + - { offset: 0x1E5E6, size: 0x8, addend: 0x0, symName: '_time::[time.odin]::_time_abs', symObjAddr: 0x274, symBinAddr: 0x100044E14, symSize: 0x3C } + - { offset: 0x1E611, size: 0x8, addend: 0x0, symName: '_time::[time.odin]::_time_abs', symObjAddr: 0x274, symBinAddr: 0x100044E14, symSize: 0x3C } + - { offset: 0x1E619, size: 0x8, addend: 0x0, symName: '_time::[time.odin]::_abs_date', symObjAddr: 0x2B0, symBinAddr: 0x100044E50, symSize: 0x3F0 } + - { offset: 0x1E645, size: 0x8, addend: 0x0, symName: '_time::[time.odin]::_abs_date', symObjAddr: 0x2B0, symBinAddr: 0x100044E50, symSize: 0x3F0 } + - { offset: 0x1E64D, size: 0x8, addend: 0x0, symName: '_time::is_leap_year', symObjAddr: 0x6A0, symBinAddr: 0x100045240, symSize: 0xD4 } + - { offset: 0x1E6D5, size: 0x8, addend: 0x0, symName: '_time::is_leap_year', symObjAddr: 0x6A0, symBinAddr: 0x100045240, symSize: 0xD4 } + - { offset: 0x1E735, size: 0x8, addend: 0x0, symName: '_time::is_leap_year', symObjAddr: 0x6A0, symBinAddr: 0x100045240, symSize: 0xD4 } + - { offset: 0x1E7AF, size: 0x8, addend: 0x0, symName: '_screens::[screens.odin]::draw_card_art', symObjAddr: 0x0, symBinAddr: 0x100045314, symSize: 0x388 } + - { offset: 0x1ED25, size: 0x8, addend: 0x0, symName: '_screens::[screens.odin]::draw_card_art', symObjAddr: 0x0, symBinAddr: 0x100045314, symSize: 0x388 } + - { offset: 0x1ED2D, size: 0x8, addend: 0x0, symName: '_screens::main_menu', symObjAddr: 0x388, symBinAddr: 0x10004569C, symSize: 0x68C } + - { offset: 0x1EDE4, size: 0x8, addend: 0x0, symName: '_screens::main_menu', symObjAddr: 0x388, symBinAddr: 0x10004569C, symSize: 0x68C } + - { offset: 0x1EDEC, size: 0x8, addend: 0x0, symName: '_screens::language_menu', symObjAddr: 0xA14, symBinAddr: 0x100045D28, symSize: 0xE30 } + - { offset: 0x1EE1F, size: 0x8, addend: 0x0, symName: '_screens::language_menu', symObjAddr: 0xA14, symBinAddr: 0x100045D28, symSize: 0xE30 } + - { offset: 0x1EF90, size: 0x8, addend: 0x0, symName: '_screens::language_menu', symObjAddr: 0xA14, symBinAddr: 0x100045D28, symSize: 0xE30 } + - { offset: 0x1F820, size: 0x8, addend: 0x0, symName: '_utf8::encode_rune', symObjAddr: 0x0, symBinAddr: 0x100046B58, symSize: 0x210 } + - { offset: 0x1F9D3, size: 0x8, addend: 0x0, symName: '_utf8::encode_rune', symObjAddr: 0x0, symBinAddr: 0x100046B58, symSize: 0x210 } + - { offset: 0x1F9DB, size: 0x8, addend: 0x0, symName: '_utf8::decode_rune_in_string', symObjAddr: 0x210, symBinAddr: 0x100046D68, symSize: 0x6C } + - { offset: 0x1FA0D, size: 0x8, addend: 0x0, symName: '_utf8::decode_rune_in_string', symObjAddr: 0x210, symBinAddr: 0x100046D68, symSize: 0x6C } + - { offset: 0x1FA48, size: 0x8, addend: 0x0, symName: '_utf8::decode_rune_in_string', symObjAddr: 0x210, symBinAddr: 0x100046D68, symSize: 0x6C } + - { offset: 0x1FA50, size: 0x8, addend: 0x0, symName: '_utf8::decode_rune_in_bytes', symObjAddr: 0x27C, symBinAddr: 0x100046DD4, symSize: 0x408 } + - { offset: 0x1FA7B, size: 0x8, addend: 0x0, symName: '_utf8::decode_rune_in_bytes', symObjAddr: 0x27C, symBinAddr: 0x100046DD4, symSize: 0x408 } + - { offset: 0x1FA83, size: 0x8, addend: 0x0, symName: '_utf8::decode_last_rune_in_string', symObjAddr: 0x684, symBinAddr: 0x1000471DC, symSize: 0x6C } + - { offset: 0x1FAB5, size: 0x8, addend: 0x0, symName: '_utf8::decode_last_rune_in_string', symObjAddr: 0x684, symBinAddr: 0x1000471DC, symSize: 0x6C } + - { offset: 0x1FB61, size: 0x8, addend: 0x0, symName: '_utf8::decode_last_rune_in_string', symObjAddr: 0x684, symBinAddr: 0x1000471DC, symSize: 0x6C } + - { offset: 0x1FB69, size: 0x8, addend: 0x0, symName: '_utf8::decode_last_rune_in_bytes', symObjAddr: 0x6F0, symBinAddr: 0x100047248, symSize: 0x1FC } + - { offset: 0x1FB94, size: 0x8, addend: 0x0, symName: '_utf8::decode_last_rune_in_bytes', symObjAddr: 0x6F0, symBinAddr: 0x100047248, symSize: 0x1FC } + - { offset: 0x1FB9C, size: 0x8, addend: 0x0, symName: '_utf8::rune_start', symObjAddr: 0x8EC, symBinAddr: 0x100047444, symSize: 0x28 } + - { offset: 0x1FBCE, size: 0x8, addend: 0x0, symName: '_utf8::rune_start', symObjAddr: 0x8EC, symBinAddr: 0x100047444, symSize: 0x28 } + - { offset: 0x1FC29, size: 0x8, addend: 0x0, symName: '_utf8::rune_start', symObjAddr: 0x8EC, symBinAddr: 0x100047444, symSize: 0x28 } + - { offset: 0x1FC31, size: 0x8, addend: 0x0, symName: '_utf8::rune_count_in_string', symObjAddr: 0x914, symBinAddr: 0x10004746C, symSize: 0x4C } + - { offset: 0x1FC5D, size: 0x8, addend: 0x0, symName: '_utf8::rune_count_in_string', symObjAddr: 0x914, symBinAddr: 0x10004746C, symSize: 0x4C } + - { offset: 0x1FC65, size: 0x8, addend: 0x0, symName: '_utf8::rune_count_in_bytes', symObjAddr: 0x960, symBinAddr: 0x1000474B8, symSize: 0x2EC } + - { offset: 0x1FC91, size: 0x8, addend: 0x0, symName: '_utf8::rune_count_in_bytes', symObjAddr: 0x960, symBinAddr: 0x1000474B8, symSize: 0x2EC } + - { offset: 0x1FEAB, size: 0x8, addend: 0x0, symName: '_runtime::[thread_management.odin]::thread_local_cleaners', symObjAddr: 0xAA08, symBinAddr: 0x10013D2C0, symSize: 0x0 } + - { offset: 0x203C7, size: 0x8, addend: 0x0, symName: '_runtime::[print.odin]::_INTEGER_DIGITS_VAR', symObjAddr: 0xAA88, symBinAddr: 0x10013D340, symSize: 0x0 } + - { offset: 0x203DF, size: 0x8, addend: 0x0, symName: '_runtime::type_table', symObjAddr: 0x24F0, symBinAddr: 0x100133410, symSize: 0x0 } + - { offset: 0x20E5D, size: 0x8, addend: 0x0, symName: '_runtime::args__', symObjAddr: 0xAA98, symBinAddr: 0x10013D350, symSize: 0x0 } + - { offset: 0x20EBC, size: 0x8, addend: 0x0, symName: '_runtime::global_default_temp_allocator_data', symObjAddr: 0xDA48, symBinAddr: 0x10013FB20, symSize: 0x0 } + - { offset: 0x20F97, size: 0x8, addend: 0x0, symName: '_assets::FONT_PATHS', symObjAddr: 0x2500, symBinAddr: 0x100133420, symSize: 0x0 } + - { offset: 0x20FC4, size: 0x8, addend: 0x0, symName: '_assets::fonts', symObjAddr: 0xAAA8, symBinAddr: 0x10013D360, symSize: 0x0 } + - { offset: 0x21251, size: 0x8, addend: 0x0, symName: '_audio::sounds', symObjAddr: 0xAB68, symBinAddr: 0x10013D420, symSize: 0x0 } + - { offset: 0x212EF, size: 0x8, addend: 0x0, symName: '_audio::ready', symObjAddr: 0xAC30, symBinAddr: 0x10013D4E8, symSize: 0x0 } + - { offset: 0x21306, size: 0x8, addend: 0x0, symName: '_card::[card.odin]::back_art', symObjAddr: 0xAC34, symBinAddr: 0x10013D4EC, symSize: 0x0 } + - { offset: 0x21364, size: 0x8, addend: 0x0, symName: '_decks::DECKS', symObjAddr: 0x2520, symBinAddr: 0x100133440, symSize: 0x0 } + - { offset: 0x213E2, size: 0x8, addend: 0x0, symName: '_decks::LANGUAGES', symObjAddr: 0x2580, symBinAddr: 0x1001334A0, symSize: 0x0 } + - { offset: 0x2152A, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::japanese_decks', symObjAddr: 0x8A30, symBinAddr: 0x10011BDF0, symSize: 0x0 } + - { offset: 0x21574, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::korean_decks', symObjAddr: 0x8A40, symBinAddr: 0x10011BE00, symSize: 0x0 } + - { offset: 0x21598, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::thai_decks', symObjAddr: 0x8A48, symBinAddr: 0x10011BE08, symSize: 0x0 } + - { offset: 0x215AF, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::hiragana', symObjAddr: 0x2658, symBinAddr: 0x100133578, symSize: 0x0 } + - { offset: 0x21604, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::katakana', symObjAddr: 0x2AA8, symBinAddr: 0x1001339C8, symSize: 0x0 } + - { offset: 0x2161B, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::hangul', symObjAddr: 0x2EF8, symBinAddr: 0x100133E18, symSize: 0x0 } + - { offset: 0x2163F, size: 0x8, addend: 0x0, symName: '_decks::[decks.odin]::thai_consonants', symObjAddr: 0x3138, symBinAddr: 0x100134058, symSize: 0x0 } + - { offset: 0x21663, size: 0x8, addend: 0x0, symName: '_memory::LAYOUTS', symObjAddr: 0x8A50, symBinAddr: 0x10011BE10, symSize: 0x0 } + - { offset: 0x216B4, size: 0x8, addend: 0x0, symName: '_memory::DIFFICULTY_NAMES', symObjAddr: 0x3528, symBinAddr: 0x100134448, symSize: 0x0 } + - { offset: 0x216E1, size: 0x8, addend: 0x0, symName: '_memory::cards', symObjAddr: 0xACB8, symBinAddr: 0x10013D570, symSize: 0x0 } + - { offset: 0x21791, size: 0x8, addend: 0x0, symName: '_memory::card_count', symObjAddr: 0xB9B8, symBinAddr: 0x10013E270, symSize: 0x0 } + - { offset: 0x217A8, size: 0x8, addend: 0x0, symName: '_memory::pair_count', symObjAddr: 0xB9C0, symBinAddr: 0x10013E278, symSize: 0x0 } + - { offset: 0x217BF, size: 0x8, addend: 0x0, symName: '_memory::deck', symObjAddr: 0xB9C8, symBinAddr: 0x10013E280, symSize: 0x0 } + - { offset: 0x217D6, size: 0x8, addend: 0x0, symName: '_memory::difficulty', symObjAddr: 0xB9D0, symBinAddr: 0x10013E288, symSize: 0x0 } + - { offset: 0x2180D, size: 0x8, addend: 0x0, symName: '_memory::theme', symObjAddr: 0xB9D8, symBinAddr: 0x10013E290, symSize: 0x0 } + - { offset: 0x21824, size: 0x8, addend: 0x0, symName: '_memory::layout', symObjAddr: 0xBA00, symBinAddr: 0x10013E2B8, symSize: 0x0 } + - { offset: 0x2183B, size: 0x8, addend: 0x0, symName: '_memory::state', symObjAddr: 0xBA10, symBinAddr: 0x10013E2C8, symSize: 0x0 } + - { offset: 0x21878, size: 0x8, addend: 0x0, symName: '_memory::first', symObjAddr: 0xBA18, symBinAddr: 0x10013E2D0, symSize: 0x0 } + - { offset: 0x2188F, size: 0x8, addend: 0x0, symName: '_memory::second', symObjAddr: 0xBA20, symBinAddr: 0x10013E2D8, symSize: 0x0 } + - { offset: 0x218A6, size: 0x8, addend: 0x0, symName: '_memory::matches', symObjAddr: 0xBA28, symBinAddr: 0x10013E2E0, symSize: 0x0 } + - { offset: 0x218BD, size: 0x8, addend: 0x0, symName: '_memory::moves', symObjAddr: 0xBA30, symBinAddr: 0x10013E2E8, symSize: 0x0 } + - { offset: 0x218D4, size: 0x8, addend: 0x0, symName: '_memory::elapsed', symObjAddr: 0xBA38, symBinAddr: 0x10013E2F0, symSize: 0x0 } + - { offset: 0x218EB, size: 0x8, addend: 0x0, symName: '_memory::resolve_timer', symObjAddr: 0xBA3C, symBinAddr: 0x10013E2F4, symSize: 0x0 } + - { offset: 0x21902, size: 0x8, addend: 0x0, symName: '_memory::win_t', symObjAddr: 0xBA40, symBinAddr: 0x10013E2F8, symSize: 0x0 } + - { offset: 0x21919, size: 0x8, addend: 0x0, symName: '_memory::restart_requested', symObjAddr: 0xBA44, symBinAddr: 0x10013E2FC, symSize: 0x0 } + - { offset: 0x21930, size: 0x8, addend: 0x0, symName: '_ui::[ui.odin]::any_hovered', symObjAddr: 0xBA45, symBinAddr: 0x10013E2FD, symSize: 0x0 } + - { offset: 0x21947, size: 0x8, addend: 0x0, symName: '_fmt::_user_formatters', symObjAddr: 0xBA48, symBinAddr: 0x10013E300, symSize: 0x0 } + - { offset: 0x21CFB, size: 0x8, addend: 0x0, symName: '_fmt::__MEMORY_LOWER', symObjAddr: 0x3540, symBinAddr: 0x100134460, symSize: 0x0 } + - { offset: 0x21D13, size: 0x8, addend: 0x0, symName: '_fmt::__MEMORY_UPPER', symObjAddr: 0x3550, symBinAddr: 0x100134470, symSize: 0x0 } + - { offset: 0x21D2B, size: 0x8, addend: 0x0, symName: '_fmt::__DIGITS_LOWER', symObjAddr: 0x3560, symBinAddr: 0x100134480, symSize: 0x0 } + - { offset: 0x21D43, size: 0x8, addend: 0x0, symName: '_fmt::__DIGITS_UPPER', symObjAddr: 0x3570, symBinAddr: 0x100134490, symSize: 0x0 } + - { offset: 0x21D5B, size: 0x8, addend: 0x0, symName: '_mem::PAGE_SIZE', symObjAddr: 0xBA50, symBinAddr: 0x10013E308, symSize: 0x0 } + - { offset: 0x21D72, size: 0x8, addend: 0x0, symName: '_io::[util.odin]::DIGITS_LOWER', symObjAddr: 0xBA58, symBinAddr: 0x10013E310, symSize: 0x0 } + - { offset: 0x21D8A, size: 0x8, addend: 0x0, symName: '_time::days_before', symObjAddr: 0x8A80, symBinAddr: 0x10011BE40, symSize: 0x0 } + - { offset: 0x21DAE, size: 0x8, addend: 0x0, symName: '_os::stdin', symObjAddr: 0xBA68, symBinAddr: 0x10013E320, symSize: 0x0 } + - { offset: 0x22178, size: 0x8, addend: 0x0, symName: '_os::stdout', symObjAddr: 0xBA70, symBinAddr: 0x10013E328, symSize: 0x0 } + - { offset: 0x2218F, size: 0x8, addend: 0x0, symName: '_os::stderr', symObjAddr: 0xBA78, symBinAddr: 0x10013E330, symSize: 0x0 } + - { offset: 0x221A6, size: 0x8, addend: 0x0, symName: '_os::[allocators.odin]::global_default_temp_allocator_arenas', symObjAddr: 0xDA60, symBinAddr: 0x10013FB38, symSize: 0x0 } + - { offset: 0x221CB, size: 0x8, addend: 0x0, symName: '_os::[process.odin]::internal_args_to_free', symObjAddr: 0xBA80, symBinAddr: 0x10013E338, symSize: 0x0 } + - { offset: 0x221E2, size: 0x8, addend: 0x0, symName: '_strconv::_f16_info', symObjAddr: 0xBA90, symBinAddr: 0x10013E348, symSize: 0x0 } + - { offset: 0x2222A, size: 0x8, addend: 0x0, symName: '_strconv::_f32_info', symObjAddr: 0xBAA8, symBinAddr: 0x10013E360, symSize: 0x0 } + - { offset: 0x22241, size: 0x8, addend: 0x0, symName: '_strconv::_f64_info', symObjAddr: 0xBAC0, symBinAddr: 0x10013E378, symSize: 0x0 } + - { offset: 0x22258, size: 0x8, addend: 0x0, symName: '_strconv::digits', symObjAddr: 0xBAD8, symBinAddr: 0x10013E390, symSize: 0x0 } + - { offset: 0x2226F, size: 0x8, addend: 0x0, symName: '_utf8::accept_ranges', symObjAddr: 0xBAE8, symBinAddr: 0x10013E3A0, symSize: 0x0 } + - { offset: 0x222B7, size: 0x8, addend: 0x0, symName: '_utf8::accept_sizes', symObjAddr: 0xBAF2, symBinAddr: 0x10013E3AA, symSize: 0x0 } + - { offset: 0x222DD, size: 0x8, addend: 0x0, symName: '_strconv_decimal::[decimal.odin]::_shift_left_offsets', symObjAddr: 0xBBF8, symBinAddr: 0x10013E4B0, symSize: 0x0 } + - { offset: 0x22789, size: 0x8, addend: 0x0, symName: '_posix::get_errno', symObjAddr: 0x0, symBinAddr: 0x100047AEC, symSize: 0x18 } + - { offset: 0x25450, size: 0x8, addend: 0x0, symName: '_posix::get_errno', symObjAddr: 0x0, symBinAddr: 0x100047AEC, symSize: 0x18 } + - { offset: 0x25458, size: 0x8, addend: 0x0, symName: '_posix::S_ISBLK', symObjAddr: 0x18, symBinAddr: 0x100047B04, symSize: 0x2C } + - { offset: 0x25473, size: 0x8, addend: 0x0, symName: '_posix::S_ISBLK', symObjAddr: 0x18, symBinAddr: 0x100047B04, symSize: 0x2C } + - { offset: 0x2547B, size: 0x8, addend: 0x0, symName: '_posix::S_ISCHR', symObjAddr: 0x44, symBinAddr: 0x100047B30, symSize: 0x2C } + - { offset: 0x254A5, size: 0x8, addend: 0x0, symName: '_posix::S_ISCHR', symObjAddr: 0x44, symBinAddr: 0x100047B30, symSize: 0x2C } + - { offset: 0x254AD, size: 0x8, addend: 0x0, symName: '_posix::S_ISFIFO', symObjAddr: 0x70, symBinAddr: 0x100047B5C, symSize: 0x2C } + - { offset: 0x254D7, size: 0x8, addend: 0x0, symName: '_posix::S_ISFIFO', symObjAddr: 0x70, symBinAddr: 0x100047B5C, symSize: 0x2C } + - { offset: 0x254DF, size: 0x8, addend: 0x0, symName: '_posix::S_ISREG', symObjAddr: 0x9C, symBinAddr: 0x100047B88, symSize: 0x2C } + - { offset: 0x25509, size: 0x8, addend: 0x0, symName: '_posix::S_ISREG', symObjAddr: 0x9C, symBinAddr: 0x100047B88, symSize: 0x2C } + - { offset: 0x25511, size: 0x8, addend: 0x0, symName: '_posix::S_ISDIR', symObjAddr: 0xC8, symBinAddr: 0x100047BB4, symSize: 0x2C } + - { offset: 0x2553B, size: 0x8, addend: 0x0, symName: '_posix::S_ISDIR', symObjAddr: 0xC8, symBinAddr: 0x100047BB4, symSize: 0x2C } + - { offset: 0x25543, size: 0x8, addend: 0x0, symName: '_posix::S_ISLNK', symObjAddr: 0xF4, symBinAddr: 0x100047BE0, symSize: 0x2C } + - { offset: 0x2556D, size: 0x8, addend: 0x0, symName: '_posix::S_ISLNK', symObjAddr: 0xF4, symBinAddr: 0x100047BE0, symSize: 0x2C } + - { offset: 0x25575, size: 0x8, addend: 0x0, symName: '_posix::S_ISSOCK', symObjAddr: 0x120, symBinAddr: 0x100047C0C, symSize: 0x2C } + - { offset: 0x2559F, size: 0x8, addend: 0x0, symName: '_posix::S_ISSOCK', symObjAddr: 0x120, symBinAddr: 0x100047C0C, symSize: 0x2C } + - { offset: 0x2570A, size: 0x8, addend: 0x0, symName: '_libc::errno', symObjAddr: 0x0, symBinAddr: 0x100047C38, symSize: 0x14 } + - { offset: 0x25CB5, size: 0x8, addend: 0x0, symName: '_libc::errno', symObjAddr: 0x0, symBinAddr: 0x100047C38, symSize: 0x14 } + - { offset: 0x25D00, size: 0x8, addend: 0x0, symName: '_memory::start', symObjAddr: 0x0, symBinAddr: 0x100047C4C, symSize: 0xE8 } + - { offset: 0x25F98, size: 0x8, addend: 0x0, symName: '_memory::start', symObjAddr: 0x0, symBinAddr: 0x100047C4C, symSize: 0xE8 } + - { offset: 0x25FA0, size: 0x8, addend: 0x0, symName: '_memory::deal', symObjAddr: 0xE8, symBinAddr: 0x100047D34, symSize: 0x938 } + - { offset: 0x26029, size: 0x8, addend: 0x0, symName: '_memory::deal', symObjAddr: 0xE8, symBinAddr: 0x100047D34, symSize: 0x938 } + - { offset: 0x26031, size: 0x8, addend: 0x0, symName: '_memory::active_cards', symObjAddr: 0xA20, symBinAddr: 0x10004866C, symSize: 0x88 } + - { offset: 0x261A1, size: 0x8, addend: 0x0, symName: '_memory::active_cards', symObjAddr: 0xA20, symBinAddr: 0x10004866C, symSize: 0x88 } + - { offset: 0x261A9, size: 0x8, addend: 0x0, symName: '_memory::unload', symObjAddr: 0xAA8, symBinAddr: 0x1000486F4, symSize: 0x6C } + - { offset: 0x261C4, size: 0x8, addend: 0x0, symName: '_memory::unload', symObjAddr: 0xAA8, symBinAddr: 0x1000486F4, symSize: 0x6C } + - { offset: 0x261CC, size: 0x8, addend: 0x0, symName: '_memory::can_pick', symObjAddr: 0xB14, symBinAddr: 0x100048760, symSize: 0x138 } + - { offset: 0x26215, size: 0x8, addend: 0x0, symName: '_memory::can_pick', symObjAddr: 0xB14, symBinAddr: 0x100048760, symSize: 0x138 } + - { offset: 0x2621D, size: 0x8, addend: 0x0, symName: '_memory::select_card', symObjAddr: 0xC4C, symBinAddr: 0x100048898, symSize: 0x234 } + - { offset: 0x2624E, size: 0x8, addend: 0x0, symName: '_memory::select_card', symObjAddr: 0xC4C, symBinAddr: 0x100048898, symSize: 0x234 } + - { offset: 0x26268, size: 0x8, addend: 0x0, symName: '_memory::select_card', symObjAddr: 0xC4C, symBinAddr: 0x100048898, symSize: 0x234 } + - { offset: 0x26270, size: 0x8, addend: 0x0, symName: '_memory::[memory.odin]::resolve', symObjAddr: 0xE80, symBinAddr: 0x100048ACC, symSize: 0x1FC } + - { offset: 0x262CE, size: 0x8, addend: 0x0, symName: '_memory::[memory.odin]::resolve', symObjAddr: 0xE80, symBinAddr: 0x100048ACC, symSize: 0x1FC } + - { offset: 0x262D6, size: 0x8, addend: 0x0, symName: '_memory::update', symObjAddr: 0x107C, symBinAddr: 0x100048CC8, symSize: 0x2BC } + - { offset: 0x26331, size: 0x8, addend: 0x0, symName: '_memory::update', symObjAddr: 0x107C, symBinAddr: 0x100048CC8, symSize: 0x2BC } + - { offset: 0x26339, size: 0x8, addend: 0x0, symName: '_memory::draw', symObjAddr: 0x1338, symBinAddr: 0x100048F84, symSize: 0x598 } + - { offset: 0x263C2, size: 0x8, addend: 0x0, symName: '_memory::draw', symObjAddr: 0x1338, symBinAddr: 0x100048F84, symSize: 0x598 } + - { offset: 0x263CA, size: 0x8, addend: 0x0, symName: '_memory::[memory.odin]::draw_win_panel', symObjAddr: 0x18D0, symBinAddr: 0x10004951C, symSize: 0x9C4 } + - { offset: 0x263FD, size: 0x8, addend: 0x0, symName: '_memory::[memory.odin]::draw_win_panel', symObjAddr: 0x18D0, symBinAddr: 0x10004951C, symSize: 0x9C4 } + - { offset: 0x264AC, size: 0x8, addend: 0x0, symName: '_memory::[memory.odin]::draw_win_panel', symObjAddr: 0x18D0, symBinAddr: 0x10004951C, symSize: 0x9C4 } + - { offset: 0x26C99, size: 0x8, addend: 0x0, symName: '_runtime::type_info_base', symObjAddr: 0x0, symBinAddr: 0x100049EE0, symSize: 0xB4 } + - { offset: 0x26F39, size: 0x8, addend: 0x0, symName: '_runtime::type_info_base', symObjAddr: 0x0, symBinAddr: 0x100049EE0, symSize: 0xB4 } + - { offset: 0x26F41, size: 0x8, addend: 0x0, symName: '_runtime::type_info_core', symObjAddr: 0xB4, symBinAddr: 0x100049F94, symSize: 0x118 } + - { offset: 0x26F85, size: 0x8, addend: 0x0, symName: '_runtime::type_info_core', symObjAddr: 0xB4, symBinAddr: 0x100049F94, symSize: 0x118 } + - { offset: 0x26FE6, size: 0x8, addend: 0x0, symName: '_runtime::type_info_core', symObjAddr: 0xB4, symBinAddr: 0x100049F94, symSize: 0x118 } + - { offset: 0x26FEE, size: 0x8, addend: 0x0, symName: '_runtime::__type_info_of', symObjAddr: 0x1CC, symBinAddr: 0x10004A0AC, symSize: 0x148 } + - { offset: 0x27032, size: 0x8, addend: 0x0, symName: '_runtime::__type_info_of', symObjAddr: 0x1CC, symBinAddr: 0x10004A0AC, symSize: 0x148 } + - { offset: 0x27093, size: 0x8, addend: 0x0, symName: '_runtime::__type_info_of', symObjAddr: 0x1CC, symBinAddr: 0x10004A0AC, symSize: 0x148 } + - { offset: 0x2709B, size: 0x8, addend: 0x0, symName: '_runtime::typeid_base', symObjAddr: 0x314, symBinAddr: 0x10004A1F4, symSize: 0x40 } + - { offset: 0x270CF, size: 0x8, addend: 0x0, symName: '_runtime::typeid_base', symObjAddr: 0x314, symBinAddr: 0x10004A1F4, symSize: 0x40 } + - { offset: 0x2711D, size: 0x8, addend: 0x0, symName: '_runtime::typeid_base', symObjAddr: 0x314, symBinAddr: 0x10004A1F4, symSize: 0x40 } + - { offset: 0x27125, size: 0x8, addend: 0x0, symName: '_runtime::default_logger_proc', symObjAddr: 0x354, symBinAddr: 0x10004A234, symSize: 0x4C } + - { offset: 0x27158, size: 0x8, addend: 0x0, symName: '_runtime::default_logger_proc', symObjAddr: 0x354, symBinAddr: 0x10004A234, symSize: 0x4C } + - { offset: 0x27173, size: 0x8, addend: 0x0, symName: '_runtime::default_logger_proc', symObjAddr: 0x354, symBinAddr: 0x10004A234, symSize: 0x4C } + - { offset: 0x2717B, size: 0x8, addend: 0x0, symName: '_runtime::default_context', symObjAddr: 0x3A0, symBinAddr: 0x10004A280, symSize: 0x50 } + - { offset: 0x271D2, size: 0x8, addend: 0x0, symName: '_runtime::default_context', symObjAddr: 0x3A0, symBinAddr: 0x10004A280, symSize: 0x50 } + - { offset: 0x271DA, size: 0x8, addend: 0x0, symName: '_runtime::[core.odin]::__init_context', symObjAddr: 0x3F0, symBinAddr: 0x10004A2D0, symSize: 0xCC } + - { offset: 0x271FE, size: 0x8, addend: 0x0, symName: '_runtime::[core.odin]::__init_context', symObjAddr: 0x3F0, symBinAddr: 0x10004A2D0, symSize: 0xCC } + - { offset: 0x27219, size: 0x8, addend: 0x0, symName: '_runtime::[core.odin]::__init_context', symObjAddr: 0x3F0, symBinAddr: 0x10004A2D0, symSize: 0xCC } + - { offset: 0x27221, size: 0x8, addend: 0x0, symName: '_runtime::default_assertion_failure_proc', symObjAddr: 0x4BC, symBinAddr: 0x10004A39C, symSize: 0x78 } + - { offset: 0x27249, size: 0x8, addend: 0x0, symName: '_runtime::default_assertion_failure_proc', symObjAddr: 0x4BC, symBinAddr: 0x10004A39C, symSize: 0x78 } + - { offset: 0x27251, size: 0x8, addend: 0x0, symName: '_runtime::default_assertion_contextless_failure_proc', symObjAddr: 0x534, symBinAddr: 0x10004A414, symSize: 0x104 } + - { offset: 0x2729B, size: 0x8, addend: 0x0, symName: '_runtime::default_assertion_contextless_failure_proc', symObjAddr: 0x534, symBinAddr: 0x10004A414, symSize: 0x104 } + - { offset: 0x28005, size: 0x8, addend: 0x0, symName: '_runtime::map_cell_index_dynamic', symObjAddr: 0x0, symBinAddr: 0x10004A518, symSize: 0x184 } + - { offset: 0x28166, size: 0x8, addend: 0x0, symName: '_runtime::map_cell_index_dynamic', symObjAddr: 0x0, symBinAddr: 0x10004A518, symSize: 0x184 } + - { offset: 0x2816E, size: 0x8, addend: 0x0, symName: '_runtime::map_cap', symObjAddr: 0x184, symBinAddr: 0x10004A69C, symSize: 0x68 } + - { offset: 0x281BE, size: 0x8, addend: 0x0, symName: '_runtime::map_cap', symObjAddr: 0x184, symBinAddr: 0x10004A69C, symSize: 0x68 } + - { offset: 0x281EF, size: 0x8, addend: 0x0, symName: '_runtime::map_cap', symObjAddr: 0x184, symBinAddr: 0x10004A69C, symSize: 0x68 } + - { offset: 0x2825B, size: 0x8, addend: 0x0, symName: '_runtime::map_cap', symObjAddr: 0x184, symBinAddr: 0x10004A69C, symSize: 0x68 } + - { offset: 0x28263, size: 0x8, addend: 0x0, symName: '_runtime::map_load_factor', symObjAddr: 0x1EC, symBinAddr: 0x10004A704, symSize: 0x40 } + - { offset: 0x2828E, size: 0x8, addend: 0x0, symName: '_runtime::map_load_factor', symObjAddr: 0x1EC, symBinAddr: 0x10004A704, symSize: 0x40 } + - { offset: 0x28296, size: 0x8, addend: 0x0, symName: '_runtime::map_resize_threshold', symObjAddr: 0x22C, symBinAddr: 0x10004A744, symSize: 0x28 } + - { offset: 0x282C0, size: 0x8, addend: 0x0, symName: '_runtime::map_resize_threshold', symObjAddr: 0x22C, symBinAddr: 0x10004A744, symSize: 0x28 } + - { offset: 0x282C8, size: 0x8, addend: 0x0, symName: '_runtime::map_log2_cap', symObjAddr: 0x254, symBinAddr: 0x10004A76C, symSize: 0x20 } + - { offset: 0x282F3, size: 0x8, addend: 0x0, symName: '_runtime::map_log2_cap', symObjAddr: 0x254, symBinAddr: 0x10004A76C, symSize: 0x20 } + - { offset: 0x282FB, size: 0x8, addend: 0x0, symName: '_runtime::map_data', symObjAddr: 0x274, symBinAddr: 0x10004A78C, symSize: 0x20 } + - { offset: 0x28326, size: 0x8, addend: 0x0, symName: '_runtime::map_data', symObjAddr: 0x274, symBinAddr: 0x10004A78C, symSize: 0x20 } + - { offset: 0x2832E, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_empty', symObjAddr: 0x294, symBinAddr: 0x10004A7AC, symSize: 0x24 } + - { offset: 0x28359, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_empty', symObjAddr: 0x294, symBinAddr: 0x10004A7AC, symSize: 0x24 } + - { offset: 0x28361, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_deleted', symObjAddr: 0x2B8, symBinAddr: 0x10004A7D0, symSize: 0x24 } + - { offset: 0x2838B, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_deleted', symObjAddr: 0x2B8, symBinAddr: 0x10004A7D0, symSize: 0x24 } + - { offset: 0x28393, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_valid', symObjAddr: 0x2DC, symBinAddr: 0x10004A7F4, symSize: 0x30 } + - { offset: 0x283BD, size: 0x8, addend: 0x0, symName: '_runtime::map_hash_is_valid', symObjAddr: 0x2DC, symBinAddr: 0x10004A7F4, symSize: 0x30 } + - { offset: 0x283C5, size: 0x8, addend: 0x0, symName: '_runtime::map_seed', symObjAddr: 0x30C, symBinAddr: 0x10004A824, symSize: 0x28 } + - { offset: 0x283EF, size: 0x8, addend: 0x0, symName: '_runtime::map_seed', symObjAddr: 0x30C, symBinAddr: 0x10004A824, symSize: 0x28 } + - { offset: 0x283F7, size: 0x8, addend: 0x0, symName: '_runtime::map_seed_from_map_data', symObjAddr: 0x334, symBinAddr: 0x10004A84C, symSize: 0xC0 } + - { offset: 0x28422, size: 0x8, addend: 0x0, symName: '_runtime::map_seed_from_map_data', symObjAddr: 0x334, symBinAddr: 0x10004A84C, symSize: 0xC0 } + - { offset: 0x2842A, size: 0x8, addend: 0x0, symName: '_runtime::map_desired_position', symObjAddr: 0x3F4, symBinAddr: 0x10004A90C, symSize: 0x58 } + - { offset: 0x2845B, size: 0x8, addend: 0x0, symName: '_runtime::map_desired_position', symObjAddr: 0x3F4, symBinAddr: 0x10004A90C, symSize: 0x58 } + - { offset: 0x28475, size: 0x8, addend: 0x0, symName: '_runtime::map_desired_position', symObjAddr: 0x3F4, symBinAddr: 0x10004A90C, symSize: 0x58 } + - { offset: 0x2847D, size: 0x8, addend: 0x0, symName: '_runtime::map_probe_distance', symObjAddr: 0x44C, symBinAddr: 0x10004A964, symSize: 0x6C } + - { offset: 0x284BD, size: 0x8, addend: 0x0, symName: '_runtime::map_probe_distance', symObjAddr: 0x44C, symBinAddr: 0x10004A964, symSize: 0x6C } + - { offset: 0x284D7, size: 0x8, addend: 0x0, symName: '_runtime::map_probe_distance', symObjAddr: 0x44C, symBinAddr: 0x10004A964, symSize: 0x6C } + - { offset: 0x284DF, size: 0x8, addend: 0x0, symName: '_runtime::map_kvh_data_dynamic', symObjAddr: 0x4B8, symBinAddr: 0x10004A9D0, symSize: 0x138 } + - { offset: 0x2852D, size: 0x8, addend: 0x0, symName: '_runtime::map_kvh_data_dynamic', symObjAddr: 0x4B8, symBinAddr: 0x10004A9D0, symSize: 0x138 } + - { offset: 0x28547, size: 0x8, addend: 0x0, symName: '_runtime::map_kvh_data_dynamic', symObjAddr: 0x4B8, symBinAddr: 0x10004A9D0, symSize: 0x138 } + - { offset: 0x2854F, size: 0x8, addend: 0x0, symName: '_runtime::map_cell_index_dynamic_const:proc"contextless"(base:uintptr,info:^runtime::Map_Cell_Info,INDEX:$$2)->(:uintptr)', symObjAddr: 0x5F0, symBinAddr: 0x10004AB08, symSize: 0xD8 } + - { offset: 0x285E0, size: 0x8, addend: 0x0, symName: '_runtime::map_cell_index_dynamic_const:proc"contextless"(base:uintptr,info:^runtime::Map_Cell_Info,INDEX:$$2)->(:uintptr)', symObjAddr: 0x5F0, symBinAddr: 0x10004AB08, symSize: 0xD8 } + - { offset: 0x2861A, size: 0x8, addend: 0x0, symName: '_runtime::map_cell_index_dynamic_const:proc"contextless"(base:uintptr,info:^runtime::Map_Cell_Info,INDEX:$$2)->(:uintptr)', symObjAddr: 0x5F0, symBinAddr: 0x10004AB08, symSize: 0xD8 } + - { offset: 0x28622, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size', symObjAddr: 0x6C8, symBinAddr: 0x10004ABE0, symSize: 0xD0 } + - { offset: 0x28663, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size', symObjAddr: 0x6C8, symBinAddr: 0x10004ABE0, symSize: 0xD0 } + - { offset: 0x286BD, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size', symObjAddr: 0x6C8, symBinAddr: 0x10004ABE0, symSize: 0xD0 } + - { offset: 0x286C5, size: 0x8, addend: 0x0, symName: '_runtime::map_alloc_dynamic', symObjAddr: 0x798, symBinAddr: 0x10004ACB0, symSize: 0x340 } + - { offset: 0x28707, size: 0x8, addend: 0x0, symName: '_runtime::map_alloc_dynamic', symObjAddr: 0x798, symBinAddr: 0x10004ACB0, symSize: 0x340 } + - { offset: 0x28732, size: 0x8, addend: 0x0, symName: '_runtime::map_alloc_dynamic', symObjAddr: 0x798, symBinAddr: 0x10004ACB0, symSize: 0x340 } + - { offset: 0x2873A, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic_with_key', symObjAddr: 0xAD8, symBinAddr: 0x10004AFF0, symSize: 0x980 } + - { offset: 0x287D1, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic_with_key', symObjAddr: 0xAD8, symBinAddr: 0x10004AFF0, symSize: 0x980 } + - { offset: 0x28831, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic_with_key', symObjAddr: 0xAD8, symBinAddr: 0x10004AFF0, symSize: 0x980 } + - { offset: 0x28839, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic', symObjAddr: 0x1458, symBinAddr: 0x10004B970, symSize: 0x84 } + - { offset: 0x288F0, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic', symObjAddr: 0x1458, symBinAddr: 0x10004B970, symSize: 0x84 } + - { offset: 0x28B53, size: 0x8, addend: 0x0, symName: '_runtime::map_insert_hash_dynamic', symObjAddr: 0x1458, symBinAddr: 0x10004B970, symSize: 0x84 } + - { offset: 0x28B5B, size: 0x8, addend: 0x0, symName: '_runtime::map_grow_dynamic', symObjAddr: 0x14DC, symBinAddr: 0x10004B9F4, symSize: 0x8C } + - { offset: 0x28BEA, size: 0x8, addend: 0x0, symName: '_runtime::map_grow_dynamic', symObjAddr: 0x14DC, symBinAddr: 0x10004B9F4, symSize: 0x8C } + - { offset: 0x28BF2, size: 0x8, addend: 0x0, symName: '_runtime::map_reserve_dynamic', symObjAddr: 0x1568, symBinAddr: 0x10004BA80, symSize: 0x410 } + - { offset: 0x28C55, size: 0x8, addend: 0x0, symName: '_runtime::map_reserve_dynamic', symObjAddr: 0x1568, symBinAddr: 0x10004BA80, symSize: 0x410 } + - { offset: 0x28C80, size: 0x8, addend: 0x0, symName: '_runtime::map_reserve_dynamic', symObjAddr: 0x1568, symBinAddr: 0x10004BA80, symSize: 0x410 } + - { offset: 0x28C88, size: 0x8, addend: 0x0, symName: '_runtime::map_free_dynamic', symObjAddr: 0x1978, symBinAddr: 0x10004BE90, symSize: 0xBC } + - { offset: 0x28CFD, size: 0x8, addend: 0x0, symName: '_runtime::map_free_dynamic', symObjAddr: 0x1978, symBinAddr: 0x10004BE90, symSize: 0xBC } + - { offset: 0x28E09, size: 0x8, addend: 0x0, symName: '_runtime::map_free_dynamic', symObjAddr: 0x1978, symBinAddr: 0x10004BE90, symSize: 0xBC } + - { offset: 0x28E11, size: 0x8, addend: 0x0, symName: '_runtime::map_clear_dynamic', symObjAddr: 0x1A34, symBinAddr: 0x10004BF4C, symSize: 0xB0 } + - { offset: 0x28E76, size: 0x8, addend: 0x0, symName: '_runtime::map_clear_dynamic', symObjAddr: 0x1A34, symBinAddr: 0x10004BF4C, symSize: 0xB0 } + - { offset: 0x28EB3, size: 0x8, addend: 0x0, symName: '_runtime::map_clear_dynamic', symObjAddr: 0x1A34, symBinAddr: 0x10004BF4C, symSize: 0xB0 } + - { offset: 0x28EBB, size: 0x8, addend: 0x0, symName: '_runtime::__dynamic_map_check_grow', symObjAddr: 0x1AE4, symBinAddr: 0x10004BFFC, symSize: 0xB4 } + - { offset: 0x28F16, size: 0x8, addend: 0x0, symName: '_runtime::__dynamic_map_check_grow', symObjAddr: 0x1AE4, symBinAddr: 0x10004BFFC, symSize: 0xB4 } + - { offset: 0x28F1E, size: 0x8, addend: 0x0, symName: '_runtime::[dynamic_map_internal.odin]::__ceil_log2', symObjAddr: 0x1B98, symBinAddr: 0x10004C0B0, symSize: 0x8C } + - { offset: 0x28F9E, size: 0x8, addend: 0x0, symName: '_runtime::[dynamic_map_internal.odin]::__ceil_log2', symObjAddr: 0x1B98, symBinAddr: 0x10004C0B0, symSize: 0x8C } + - { offset: 0x28FA6, size: 0x8, addend: 0x0, symName: '_runtime::default_hasher', symObjAddr: 0x1C24, symBinAddr: 0x10004C13C, symSize: 0x100 } + - { offset: 0x28FD9, size: 0x8, addend: 0x0, symName: '_runtime::default_hasher', symObjAddr: 0x1C24, symBinAddr: 0x10004C13C, symSize: 0x100 } + - { offset: 0x28FF4, size: 0x8, addend: 0x0, symName: '_runtime::default_hasher', symObjAddr: 0x1C24, symBinAddr: 0x10004C13C, symSize: 0x100 } + - { offset: 0x28FFC, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size.round-0', symObjAddr: 0x1D24, symBinAddr: 0x10004C23C, symSize: 0x24 } + - { offset: 0x29050, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size.round-0', symObjAddr: 0x1D24, symBinAddr: 0x10004C23C, symSize: 0x24 } + - { offset: 0x2907C, size: 0x8, addend: 0x0, symName: '_runtime::map_total_allocation_size.round-0', symObjAddr: 0x1D24, symBinAddr: 0x10004C23C, symSize: 0x24 } + - { offset: 0x29575, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::add_tone', symObjAddr: 0x0, symBinAddr: 0x10004C260, symSize: 0x250 } + - { offset: 0x296BA, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::add_tone', symObjAddr: 0x0, symBinAddr: 0x10004C260, symSize: 0x250 } + - { offset: 0x296C2, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::add_flip', symObjAddr: 0x250, symBinAddr: 0x10004C4B0, symSize: 0x1F8 } + - { offset: 0x297BE, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::add_flip', symObjAddr: 0x250, symBinAddr: 0x10004C4B0, symSize: 0x1F8 } + - { offset: 0x297C6, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::make_sound', symObjAddr: 0x448, symBinAddr: 0x10004C6A8, symSize: 0x254 } + - { offset: 0x29893, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::make_sound', symObjAddr: 0x448, symBinAddr: 0x10004C6A8, symSize: 0x254 } + - { offset: 0x2989B, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::build', symObjAddr: 0x69C, symBinAddr: 0x10004C8FC, symSize: 0x230 } + - { offset: 0x298DD, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::build', symObjAddr: 0x69C, symBinAddr: 0x10004C8FC, symSize: 0x230 } + - { offset: 0x2993A, size: 0x8, addend: 0x0, symName: '_audio::[audio.odin]::build', symObjAddr: 0x69C, symBinAddr: 0x10004C8FC, symSize: 0x230 } + - { offset: 0x29942, size: 0x8, addend: 0x0, symName: '_audio::load', symObjAddr: 0x8CC, symBinAddr: 0x10004CB2C, symSize: 0x6B4 } + - { offset: 0x299A2, size: 0x8, addend: 0x0, symName: '_audio::load', symObjAddr: 0x8CC, symBinAddr: 0x10004CB2C, symSize: 0x6B4 } + - { offset: 0x299DF, size: 0x8, addend: 0x0, symName: '_audio::load', symObjAddr: 0x8CC, symBinAddr: 0x10004CB2C, symSize: 0x6B4 } + - { offset: 0x299E7, size: 0x8, addend: 0x0, symName: '_audio::unload', symObjAddr: 0xF80, symBinAddr: 0x10004D1E0, symSize: 0x200 } + - { offset: 0x29A10, size: 0x8, addend: 0x0, symName: '_audio::unload', symObjAddr: 0xF80, symBinAddr: 0x10004D1E0, symSize: 0x200 } + - { offset: 0x29A18, size: 0x8, addend: 0x0, symName: '_audio::play', symObjAddr: 0x1180, symBinAddr: 0x10004D3E0, symSize: 0x260 } + - { offset: 0x29A52, size: 0x8, addend: 0x0, symName: '_audio::play', symObjAddr: 0x1180, symBinAddr: 0x10004D3E0, symSize: 0x260 } + - { offset: 0x29FD9, size: 0x8, addend: 0x0, symName: '_runtime::memset', symObjAddr: 0x0, symBinAddr: 0x10004D640, symSize: 0xC0 } + - { offset: 0x29FEA, size: 0x8, addend: 0x0, symName: '_runtime::memset', symObjAddr: 0x0, symBinAddr: 0x10004D640, symSize: 0xC0 } + - { offset: 0x2A100, size: 0x8, addend: 0x0, symName: '_ui::begin_frame', symObjAddr: 0x0, symBinAddr: 0x10004D700, symSize: 0x14 } + - { offset: 0x2A547, size: 0x8, addend: 0x0, symName: '_ui::begin_frame', symObjAddr: 0x0, symBinAddr: 0x10004D700, symSize: 0x14 } + - { offset: 0x2A54F, size: 0x8, addend: 0x0, symName: '_ui::end_frame', symObjAddr: 0x14, symBinAddr: 0x10004D714, symSize: 0x30 } + - { offset: 0x2A566, size: 0x8, addend: 0x0, symName: '_ui::end_frame', symObjAddr: 0x14, symBinAddr: 0x10004D714, symSize: 0x30 } + - { offset: 0x2A56E, size: 0x8, addend: 0x0, symName: '_ui::set_hovered', symObjAddr: 0x44, symBinAddr: 0x10004D744, symSize: 0x18 } + - { offset: 0x2A585, size: 0x8, addend: 0x0, symName: '_ui::set_hovered', symObjAddr: 0x44, symBinAddr: 0x10004D744, symSize: 0x18 } + - { offset: 0x2A58D, size: 0x8, addend: 0x0, symName: '_ui::measure_text', symObjAddr: 0x5C, symBinAddr: 0x10004D75C, symSize: 0xCC } + - { offset: 0x2A5A4, size: 0x8, addend: 0x0, symName: '_ui::measure_text', symObjAddr: 0x5C, symBinAddr: 0x10004D75C, symSize: 0xCC } + - { offset: 0x2A5AC, size: 0x8, addend: 0x0, symName: '_ui::draw_text', symObjAddr: 0x128, symBinAddr: 0x10004D828, symSize: 0x13C } + - { offset: 0x2A605, size: 0x8, addend: 0x0, symName: '_ui::draw_text', symObjAddr: 0x128, symBinAddr: 0x10004D828, symSize: 0x13C } + - { offset: 0x2A60D, size: 0x8, addend: 0x0, symName: '_ui::draw_text_centered', symObjAddr: 0x264, symBinAddr: 0x10004D964, symSize: 0x204 } + - { offset: 0x2A680, size: 0x8, addend: 0x0, symName: '_ui::draw_text_centered', symObjAddr: 0x264, symBinAddr: 0x10004D964, symSize: 0x204 } + - { offset: 0x2A688, size: 0x8, addend: 0x0, symName: '_ui::draw_text_in_rect', symObjAddr: 0x468, symBinAddr: 0x10004DB68, symSize: 0x14C } + - { offset: 0x2A74B, size: 0x8, addend: 0x0, symName: '_ui::draw_text_in_rect', symObjAddr: 0x468, symBinAddr: 0x10004DB68, symSize: 0x14C } + - { offset: 0x2A753, size: 0x8, addend: 0x0, symName: '_ui::draw_title', symObjAddr: 0x5B4, symBinAddr: 0x10004DCB4, symSize: 0x94 } + - { offset: 0x2A7F8, size: 0x8, addend: 0x0, symName: '_ui::draw_title', symObjAddr: 0x5B4, symBinAddr: 0x10004DCB4, symSize: 0x94 } + - { offset: 0x2A800, size: 0x8, addend: 0x0, symName: '_ui::button', symObjAddr: 0x648, symBinAddr: 0x10004DD48, symSize: 0x6B4 } + - { offset: 0x2A860, size: 0x8, addend: 0x0, symName: '_ui::button', symObjAddr: 0x648, symBinAddr: 0x10004DD48, symSize: 0x6B4 } +... diff --git a/assets/Jua-OFL.txt b/assets/Jua-OFL.txt new file mode 100644 index 0000000..6971a3e --- /dev/null +++ b/assets/Jua-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Jua Project Authors + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/Jua-Regular.ttf b/assets/Jua-Regular.ttf new file mode 100644 index 0000000..b2ac41e Binary files /dev/null and b/assets/Jua-Regular.ttf differ diff --git a/assets/Mali-OFL.txt b/assets/Mali-OFL.txt new file mode 100644 index 0000000..46a9a7c --- /dev/null +++ b/assets/Mali-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Mali Project Authors (https://github.com/cadsondemak/Mali) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/Mali-SemiBold.ttf b/assets/Mali-SemiBold.ttf new file mode 100644 index 0000000..089cdfd Binary files /dev/null and b/assets/Mali-SemiBold.ttf differ diff --git a/main.odin b/main.odin index d7ad2fb..df6b56c 100644 --- a/main.odin +++ b/main.odin @@ -4,6 +4,7 @@ import raylib "vendor:raylib" import assets "src/assets" import audio "src/audio" import card "src/card" +import decks "src/decks" import memory "src/memory" import screens "src/screens" import themes "src/themes" @@ -12,9 +13,9 @@ import ui "src/ui" // Where Escape takes you from each screen (nil = quit) parent_screen :: proc(screen: themes.Screen) -> Maybe(themes.Screen) { switch screen { - case .MAIN_MENU: return nil - case .JAPANESE_MEMORY: return .JAPANESE_MENU - case .JAPANESE_MENU, .KOREAN_MENU, .THAI_MENU: return .MAIN_MENU + case .MAIN_MENU: return nil + case .LANGUAGE_MENU: return .MAIN_MENU + case .MEMORY: return .LANGUAGE_MENU } return nil } @@ -40,6 +41,8 @@ main :: proc() { defer memory.unload() screen := themes.Screen.MAIN_MENU + language := decks.Language.JAPANESE + difficulty := memory.Difficulty.NORMAL running := true for running && !raylib.WindowShouldClose() { dt := raylib.GetFrameTime() @@ -52,27 +55,37 @@ main :: proc() { } } - if screen == .JAPANESE_MEMORY { + if screen == .MEMORY { memory.update(dt) } raylib.BeginDrawing() ui.begin_frame() next := screen + start_deck: Maybe(decks.Deck_Id) switch screen { - case .MAIN_MENU: next = screens.main_menu() - case .JAPANESE_MENU: next = screens.japanese_menu() - case .JAPANESE_MEMORY: next = memory.draw() - case .KOREAN_MENU: next = screens.korean_menu() - case .THAI_MENU: next = screens.thai_menu() + case .MAIN_MENU: + if picked, ok := screens.main_menu().?; ok { + language = picked + next = .LANGUAGE_MENU + } + case .LANGUAGE_MENU: + switch result in screens.language_menu(language, &difficulty) { + case decks.Deck_Id: + start_deck = result + next = .MEMORY + case themes.Screen: + next = result + } + case .MEMORY: + next = memory.draw() } ui.end_frame() raylib.EndDrawing() - // Start a fresh game when entering the memory screen (outside of drawing, - // because building card faces renders into textures) - if next == .JAPANESE_MEMORY && screen != .JAPANESE_MEMORY { - memory.start(themes.JAPAN) + // Building card faces renders into textures, so do it outside of drawing + if deck, ok := start_deck.?; ok { + memory.start(deck, difficulty) } screen = next } diff --git a/src/assets/assets.odin b/src/assets/assets.odin index b491002..e7517a1 100644 --- a/src/assets/assets.odin +++ b/src/assets/assets.odin @@ -2,28 +2,57 @@ package assets import raylib "vendor:raylib" -REGULAR_FONT_PATH :: "assets/MPLUSRounded1c-Medium.ttf" -BOLD_FONT_PATH :: "assets/MPLUSRounded1c-ExtraBold.ttf" - // Glyphs are rasterized at this size and scaled down when drawn FONT_BASE_SIZE :: 128 -regular_font: raylib.Font -bold_font: raylib.Font +Font_Style :: enum { + REGULAR, // UI text (M PLUS Rounded 1c Medium) + BOLD, // UI headings and Japanese symbols (M PLUS Rounded 1c ExtraBold) + KOREAN, // Hangul (Jua) + THAI, // Thai script (Mali SemiBold) +} -// raylib only bakes ASCII by default, so every non-ASCII glyph must be listed -@(private) -build_codepoints :: proc() -> [dynamic]rune { - codepoints: [dynamic]rune - for r in rune(0x20) ..= 0x7E { append(&codepoints, r) } // ASCII - for r in rune(0x3041) ..= 0x3096 { append(&codepoints, r) } // Hiragana - for r in rune(0x30A1) ..= 0x30FC { append(&codepoints, r) } // Katakana - for r in "日本語・·āō" { append(&codepoints, r) } +@(rodata) +FONT_PATHS := [Font_Style]cstring{ + .REGULAR = "assets/MPLUSRounded1c-Medium.ttf", + .BOLD = "assets/MPLUSRounded1c-ExtraBold.ttf", + .KOREAN = "assets/Jua-Regular.ttf", + .THAI = "assets/Mali-SemiBold.ttf", +} + +fonts: [Font_Style]raylib.Font + +// Extra non-range characters used in UI text +EXTRA_JAPANESE :: "日本語・·āō" +EXTRA_KOREAN :: "한글국어축하해요" +EXTRA_THAI :: "ไทย" + +// raylib only bakes the codepoints it is given, so every glyph a font must draw is listed here. +// Tests check that every deck's characters are covered. +codepoints_for :: proc(style: Font_Style, allocator := context.allocator) -> [dynamic]rune { + codepoints := make([dynamic]rune, allocator) + for r in rune(0x20) ..= 0x7E { append(&codepoints, r) } // ASCII + switch style { + case .REGULAR, .BOLD: + for r in rune(0x3041) ..= 0x3096 { append(&codepoints, r) } // Hiragana + for r in rune(0x30A1) ..= 0x30FC { append(&codepoints, r) } // Katakana + for r in EXTRA_JAPANESE { append(&codepoints, r) } + case .KOREAN: + for r in rune(0x3131) ..= 0x3163 { append(&codepoints, r) } // Modern Hangul compatibility jamo + for r in EXTRA_KOREAN { append(&codepoints, r) } + case .THAI: + for r in rune(0x0E01) ..= 0x0E3A { append(&codepoints, r) } // Thai (U+0E3B-0E3E are unassigned) + for r in rune(0x0E3F) ..= 0x0E5B { append(&codepoints, r) } + for r in EXTRA_THAI { append(&codepoints, r) } + } return codepoints } @(private) -load_font :: proc(path: cstring, codepoints: []rune) -> raylib.Font { +load_font :: proc(style: Font_Style) -> raylib.Font { + codepoints := codepoints_for(style) + defer delete(codepoints) + path := FONT_PATHS[style] font := raylib.LoadFontEx(path, FONT_BASE_SIZE, raw_data(codepoints), i32(len(codepoints))) if !raylib.IsFontValid(font) || font.texture.id == 0 { raylib.TraceLog(.WARNING, "ASSETS: Falling back to default font, could not load %s", path) @@ -36,18 +65,18 @@ load_font :: proc(path: cstring, codepoints: []rune) -> raylib.Font { } load_fonts :: proc() { - codepoints := build_codepoints() - defer delete(codepoints) - regular_font = load_font(REGULAR_FONT_PATH, codepoints[:]) - bold_font = load_font(BOLD_FONT_PATH, codepoints[:]) + for style in Font_Style { + fonts[style] = load_font(style) + } } unload_fonts :: proc() { default_id := raylib.GetFontDefault().texture.id - if regular_font.texture.id != default_id { raylib.UnloadFont(regular_font) } - if bold_font.texture.id != default_id { raylib.UnloadFont(bold_font) } + for font in fonts { + if font.texture.id != default_id { raylib.UnloadFont(font) } + } } -get_font :: proc(bold := false) -> raylib.Font { - return bold ? bold_font : regular_font +get_font :: proc(style: Font_Style = .REGULAR) -> raylib.Font { + return fonts[style] } diff --git a/src/card/card.odin b/src/card/card.odin index 2e46f27..d84b9f1 100644 --- a/src/card/card.odin +++ b/src/card/card.odin @@ -2,6 +2,7 @@ package card import "core:math" import raylib "vendor:raylib" +import assets "../assets" import themes "../themes" import ui "../ui" @@ -19,8 +20,9 @@ HOVER_LIFT :: 4 Card :: struct { rect: raylib.Rectangle, // resting position on screen - text: cstring, - is_kana: bool, + text: cstring, + hint: cstring, // small second line on reading cards + is_symbol: bool, // script symbol (vs. its reading) pair_id: int, face_up: bool, // logical state; the animation follows it matched: bool, @@ -154,21 +156,34 @@ get_back_art :: proc(flag: themes.Flag) -> raylib.Texture2D { return back_art[flag].texture } -// Renders the card's face into its own texture -build_face :: proc(card: ^Card, theme: themes.Theme) { +// Font size that fits text inside the card width +@(private) +fit_size :: proc(text: cstring, size: f32, style: assets.Font_Style) -> f32 { + max_width: f32 = ART_WIDTH * 0.78 + width := ui.measure_text(text, size, style).x + return width > max_width ? size * max_width / width : size +} + +// Renders the card's face into its own texture. Symbols use their script's font. +build_face :: proc(card: ^Card, theme: themes.Theme, symbol_style: assets.Font_Style) { unload_face(card) card.face_art = new_art_texture(theme.primary) raylib.BeginTextureMode(card.face_art) draw_frame(theme.card_face, theme.primary) raylib.DrawRectangleRoundedLinesEx(art_rect(16), ROUNDNESS, SEGMENTS, 2, raylib.Fade(theme.primary, 0.35)) - size: f32 = card.is_kana ? 132 : 96 - color := card.is_kana ? theme.ink : theme.primary - // Shrink long romaji (e.g. "TSU") to fit inside the card - max_width: f32 = ART_WIDTH * 0.78 - width := ui.measure_text(card.text, size, bold = true).x - if width > max_width { size *= max_width / width } - ui.draw_text_in_rect(card.text, art_rect(), size, color, bold = true) + if card.is_symbol { + ui.draw_text_in_rect(card.text, art_rect(), fit_size(card.text, 132, symbol_style), theme.ink, symbol_style) + } else if card.hint == nil { + ui.draw_text_in_rect(card.text, art_rect(), fit_size(card.text, 96, .BOLD), theme.primary, .BOLD) + } else { + // Reading on top, hint underneath + main_rect := art_rect() + main_rect.height -= 56 + ui.draw_text_in_rect(card.text, main_rect, fit_size(card.text, 88, .BOLD), theme.primary, .BOLD) + hint_rect := raylib.Rectangle{0, ART_HEIGHT * 0.62, ART_WIDTH, 60} + ui.draw_text_in_rect(card.hint, hint_rect, fit_size(card.hint, 34, .REGULAR), theme.ink, .REGULAR) + } raylib.EndTextureMode() } diff --git a/src/decks/decks.odin b/src/decks/decks.odin new file mode 100644 index 0000000..581ea24 --- /dev/null +++ b/src/decks/decks.odin @@ -0,0 +1,141 @@ +package decks + +import assets "../assets" +import themes "../themes" + +Language :: enum { + JAPANESE, + KOREAN, + THAI, +} + +Deck_Id :: enum { + HIRAGANA, + KATAKANA, + HANGUL, + THAI_CONSONANTS, +} + +// One card pair: the script symbol and how it reads +Entry :: struct { + symbol: cstring, + reading: cstring, // romanization, shown large + hint: cstring, // optional small line under the reading +} + +Deck_Info :: struct { + name: cstring, // English name, used on buttons + native: cstring, // name in its own script + language: Language, +} + +Language_Info :: struct { + theme: themes.Theme, + native: cstring, // language name in its own script + symbol_style: assets.Font_Style, // font for the script's symbols + congrats: cstring, // win message + congrats_style: assets.Font_Style, +} + +@(rodata) +DECKS := [Deck_Id]Deck_Info{ + .HIRAGANA = {name = "Hiragana", native = "ひらがな", language = .JAPANESE}, + .KATAKANA = {name = "Katakana", native = "カタカナ", language = .JAPANESE}, + .HANGUL = {name = "Hangul", native = "한글", language = .KOREAN}, + .THAI_CONSONANTS = {name = "Consonants", native = "ก ข ค", language = .THAI}, +} + +@(rodata) +LANGUAGES := [Language]Language_Info{ + .JAPANESE = {theme = themes.JAPAN, native = "日本語", symbol_style = .BOLD, congrats = "おめでとう!", congrats_style = .BOLD}, + .KOREAN = {theme = themes.KOREA, native = "한국어", symbol_style = .KOREAN, congrats = "축하해요!", congrats_style = .KOREAN}, + // Thai words with vowel/tone marks need text shaping, which raylib doesn't do + .THAI = {theme = themes.THAI, native = "ไทย", symbol_style = .THAI, congrats = "Well done!", congrats_style = .BOLD}, +} + +@(private, rodata) +japanese_decks := [?]Deck_Id{.HIRAGANA, .KATAKANA} +@(private, rodata) +korean_decks := [?]Deck_Id{.HANGUL} +@(private, rodata) +thai_decks := [?]Deck_Id{.THAI_CONSONANTS} + +decks_for :: proc(language: Language) -> []Deck_Id { + switch language { + case .JAPANESE: return japanese_decks[:] + case .KOREAN: return korean_decks[:] + case .THAI: return thai_decks[:] + } + return nil +} + +language_of :: proc(deck: Deck_Id) -> Language_Info { + return LANGUAGES[DECKS[deck].language] +} + +entries :: proc(deck: Deck_Id) -> []Entry { + switch deck { + case .HIRAGANA: return hiragana[:] + case .KATAKANA: return katakana[:] + case .HANGUL: return hangul[:] + case .THAI_CONSONANTS: return thai_consonants[:] + } + return nil +} + +// The 46 basic hiragana (gojūon) +@(private, rodata) +hiragana := [?]Entry{ + {"あ", "a", nil}, {"い", "i", nil}, {"う", "u", nil}, {"え", "e", nil}, {"お", "o", nil}, + {"か", "ka", nil}, {"き", "ki", nil}, {"く", "ku", nil}, {"け", "ke", nil}, {"こ", "ko", nil}, + {"さ", "sa", nil}, {"し", "shi", nil}, {"す", "su", nil}, {"せ", "se", nil}, {"そ", "so", nil}, + {"た", "ta", nil}, {"ち", "chi", nil}, {"つ", "tsu", nil}, {"て", "te", nil}, {"と", "to", nil}, + {"な", "na", nil}, {"に", "ni", nil}, {"ぬ", "nu", nil}, {"ね", "ne", nil}, {"の", "no", nil}, + {"は", "ha", nil}, {"ひ", "hi", nil}, {"ふ", "fu", nil}, {"へ", "he", nil}, {"ほ", "ho", nil}, + {"ま", "ma", nil}, {"み", "mi", nil}, {"む", "mu", nil}, {"め", "me", nil}, {"も", "mo", nil}, + {"や", "ya", nil}, {"ゆ", "yu", nil}, {"よ", "yo", nil}, + {"ら", "ra", nil}, {"り", "ri", nil}, {"る", "ru", nil}, {"れ", "re", nil}, {"ろ", "ro", nil}, + {"わ", "wa", nil}, {"を", "wo", nil}, {"ん", "n", nil}, +} + +// The 46 basic katakana +@(private, rodata) +katakana := [?]Entry{ + {"ア", "a", nil}, {"イ", "i", nil}, {"ウ", "u", nil}, {"エ", "e", nil}, {"オ", "o", nil}, + {"カ", "ka", nil}, {"キ", "ki", nil}, {"ク", "ku", nil}, {"ケ", "ke", nil}, {"コ", "ko", nil}, + {"サ", "sa", nil}, {"シ", "shi", nil}, {"ス", "su", nil}, {"セ", "se", nil}, {"ソ", "so", nil}, + {"タ", "ta", nil}, {"チ", "chi", nil}, {"ツ", "tsu", nil}, {"テ", "te", nil}, {"ト", "to", nil}, + {"ナ", "na", nil}, {"ニ", "ni", nil}, {"ヌ", "nu", nil}, {"ネ", "ne", nil}, {"ノ", "no", nil}, + {"ハ", "ha", nil}, {"ヒ", "hi", nil}, {"フ", "fu", nil}, {"ヘ", "he", nil}, {"ホ", "ho", nil}, + {"マ", "ma", nil}, {"ミ", "mi", nil}, {"ム", "mu", nil}, {"メ", "me", nil}, {"モ", "mo", nil}, + {"ヤ", "ya", nil}, {"ユ", "yu", nil}, {"ヨ", "yo", nil}, + {"ラ", "ra", nil}, {"リ", "ri", nil}, {"ル", "ru", nil}, {"レ", "re", nil}, {"ロ", "ro", nil}, + {"ワ", "wa", nil}, {"ヲ", "wo", nil}, {"ン", "n", nil}, +} + +// The 14 basic consonants and 10 basic vowels, Revised Romanization (initial position) +@(private, rodata) +hangul := [?]Entry{ + {"ㄱ", "g", nil}, {"ㄴ", "n", nil}, {"ㄷ", "d", nil}, {"ㄹ", "r", nil}, {"ㅁ", "m", nil}, + {"ㅂ", "b", nil}, {"ㅅ", "s", nil}, {"ㅇ", "ng", "silent first"}, {"ㅈ", "j", nil}, {"ㅊ", "ch", nil}, + {"ㅋ", "k", nil}, {"ㅌ", "t", nil}, {"ㅍ", "p", nil}, {"ㅎ", "h", nil}, + {"ㅏ", "a", nil}, {"ㅑ", "ya", nil}, {"ㅓ", "eo", nil}, {"ㅕ", "yeo", nil}, {"ㅗ", "o", nil}, + {"ㅛ", "yo", nil}, {"ㅜ", "u", nil}, {"ㅠ", "yu", nil}, {"ㅡ", "eu", nil}, {"ㅣ", "i", nil}, +} + +// The 42 Thai consonants in use (ฃ and ฅ are obsolete). Many share a sound, so the +// hint is each letter's acrophonic name word (RTGS), which is unique. +@(private, rodata) +thai_consonants := [?]Entry{ + {"ก", "k", "kai"}, {"ข", "kh", "khai"}, {"ค", "kh", "khwai"}, {"ฆ", "kh", "rakhang"}, + {"ง", "ng", "ngu"}, {"จ", "ch", "chan"}, {"ฉ", "ch", "ching"}, {"ช", "ch", "chang"}, + {"ซ", "s", "so"}, {"ฌ", "ch", "choe"}, {"ญ", "y", "ying"}, {"ฎ", "d", "chada"}, + {"ฏ", "t", "patak"}, {"ฐ", "th", "than"}, {"ฑ", "th", "montho"}, {"ฒ", "th", "phuthao"}, + {"ณ", "n", "nen"}, {"ด", "d", "dek"}, {"ต", "t", "tao"}, {"ถ", "th", "thung"}, + {"ท", "th", "thahan"}, {"ธ", "th", "thong"}, {"น", "n", "nu"}, {"บ", "b", "baimai"}, + {"ป", "p", "pla"}, {"ผ", "ph", "phueng"}, {"ฝ", "f", "fa"}, {"พ", "ph", "phan"}, + {"ฟ", "f", "fan"}, {"ภ", "ph", "samphao"}, {"ม", "m", "ma"}, {"ย", "y", "yak"}, + {"ร", "r", "ruea"}, {"ล", "l", "ling"}, {"ว", "w", "waen"}, {"ศ", "s", "sala"}, + {"ษ", "s", "ruesi"}, {"ส", "s", "suea"}, {"ห", "h", "hip"}, {"ฬ", "l", "chula"}, + {"อ", "o", "ang"}, {"ฮ", "h", "nokhuk"}, +} diff --git a/src/memory/memory.odin b/src/memory/memory.odin index 11cd9dd..2c5d29a 100644 --- a/src/memory/memory.odin +++ b/src/memory/memory.odin @@ -4,44 +4,50 @@ import "core:math/rand" import raylib "vendor:raylib" import audio "../audio" import card "../card" +import decks "../decks" import themes "../themes" import ui "../ui" -PAIR_COUNT :: 12 -CARD_COUNT :: PAIR_COUNT * 2 +MAX_CARDS :: 32 MATCH_DELAY :: 0.35 // seconds both cards stay up before a match is confirmed MISMATCH_DELAY :: 0.9 // seconds before a wrong pair flips back +Difficulty :: enum { + EASY, + NORMAL, + HARD, +} + +Layout :: struct { + rows, cols: int, +} + +@(rodata) +LAYOUTS := [Difficulty]Layout{ + .EASY = {3, 4}, + .NORMAL = {4, 6}, + .HARD = {4, 8}, +} + +@(rodata) +DIFFICULTY_NAMES := [Difficulty]cstring{.EASY = "Easy", .NORMAL = "Normal", .HARD = "Hard"} + State :: enum { - WAITING, // no card selected - FIRST, // one card selected + WAITING, // no card selected + FIRST, // one card selected RESOLVING, // two cards up, waiting before match/mismatch OVER, } -Kana :: struct { - kana: cstring, - romaji: cstring, -} - -// The 46 basic hiragana (gojūon) -HIRAGANA :: [?]Kana{ - {"あ", "a"}, {"い", "i"}, {"う", "u"}, {"え", "e"}, {"お", "o"}, - {"か", "ka"}, {"き", "ki"}, {"く", "ku"}, {"け", "ke"}, {"こ", "ko"}, - {"さ", "sa"}, {"し", "shi"}, {"す", "su"}, {"せ", "se"}, {"そ", "so"}, - {"た", "ta"}, {"ち", "chi"}, {"つ", "tsu"}, {"て", "te"}, {"と", "to"}, - {"な", "na"}, {"に", "ni"}, {"ぬ", "nu"}, {"ね", "ne"}, {"の", "no"}, - {"は", "ha"}, {"ひ", "hi"}, {"ふ", "fu"}, {"へ", "he"}, {"ほ", "ho"}, - {"ま", "ma"}, {"み", "mi"}, {"む", "mu"}, {"め", "me"}, {"も", "mo"}, - {"や", "ya"}, {"ゆ", "yu"}, {"よ", "yo"}, - {"ら", "ra"}, {"り", "ri"}, {"る", "ru"}, {"れ", "re"}, {"ろ", "ro"}, - {"わ", "wa"}, {"を", "wo"}, {"ん", "n"}, -} - -cards: [CARD_COUNT]card.Card -state: State +cards: [MAX_CARDS]card.Card +card_count: int +pair_count: int +deck: decks.Deck_Id +difficulty: Difficulty theme: themes.Theme +layout: Layout +state: State first: int = -1 second: int = -1 matches: int @@ -52,33 +58,46 @@ win_t: f32 // fades in the win panel restart_requested: bool // Deals a new game and renders the card faces. Needs the window to exist. -start :: proc(game_theme: themes.Theme) { - deal(game_theme) - for &c in cards { card.build_face(&c, theme) } +start :: proc(deck_id: decks.Deck_Id, game_difficulty: Difficulty) { + deal(deck_id, game_difficulty) + style := decks.language_of(deck).symbol_style + for &c in active_cards() { card.build_face(&c, theme, style) } } // Shuffles, lays out and resets the game state without touching the GPU -deal :: proc(game_theme: themes.Theme) { - theme = game_theme +deal :: proc(deck_id: decks.Deck_Id, game_difficulty: Difficulty) { + unload() + deck = deck_id + difficulty = game_difficulty + theme = decks.language_of(deck).theme + layout = LAYOUTS[difficulty] + card_count = layout.rows * layout.cols + pair_count = card_count / 2 - deck := HIRAGANA - rand.shuffle(deck[:]) - for i in 0 ..< PAIR_COUNT { - card.unload_face(&cards[i * 2]) - card.unload_face(&cards[i * 2 + 1]) - cards[i * 2] = card.Card{text = deck[i].kana, is_kana = true, pair_id = i} - cards[i * 2 + 1] = card.Card{text = deck[i].romaji, is_kana = false, pair_id = i} + // Pick random entries from the deck + entries := decks.entries(deck) + order := make([]int, len(entries), context.temp_allocator) + for &o, i in order { o = i } + rand.shuffle(order) + + for pair in 0 ..< pair_count { + entry := entries[order[pair]] + cards[pair * 2] = card.Card{text = entry.symbol, is_symbol = true, pair_id = pair} + cards[pair * 2 + 1] = card.Card{text = entry.reading, hint = entry.hint, pair_id = pair} } - rand.shuffle(cards[:]) + rand.shuffle(cards[:card_count]) - total_w: f32 = themes.GRID_COLS * (themes.CARD_WIDTH + themes.CARD_SPACING) - themes.CARD_SPACING + // Center the grid horizontally and in the space below the header + step_x: f32 = themes.CARD_WIDTH + themes.CARD_SPACING + step_y: f32 = themes.CARD_HEIGHT + themes.CARD_SPACING + total_w := f32(layout.cols) * step_x - themes.CARD_SPACING + total_h := f32(layout.rows) * step_y - themes.CARD_SPACING start_x := (themes.SCREEN_WIDTH - total_w) / 2 - for &c, i in cards { - row := f32(i / themes.GRID_COLS) - col := f32(i % themes.GRID_COLS) + start_y := themes.GRID_TOP + (themes.SCREEN_HEIGHT - 16 - themes.GRID_TOP - total_h) / 2 + for &c, i in active_cards() { c.rect = { - start_x + col * (themes.CARD_WIDTH + themes.CARD_SPACING), - themes.GRID_TOP + row * (themes.CARD_HEIGHT + themes.CARD_SPACING), + start_x + f32(i % layout.cols) * step_x, + start_y + f32(i / layout.cols) * step_y, themes.CARD_WIDTH, themes.CARD_HEIGHT, } @@ -95,11 +114,16 @@ deal :: proc(game_theme: themes.Theme) { restart_requested = false } +active_cards :: proc() -> []card.Card { + return cards[:card_count] +} + unload :: proc() { for &c in cards { card.unload_face(&c) } } can_pick :: proc(i: int) -> bool { + if i < 0 || i >= card_count { return false } c := &cards[i] return (state == .WAITING || state == .FIRST) && !c.face_up && !c.matched } @@ -131,7 +155,7 @@ resolve :: proc() { card.start_pulse(a) card.start_pulse(b) matches += 1 - if matches == PAIR_COUNT { + if matches == pair_count { state = .OVER audio.play(.WIN) } else { @@ -151,17 +175,17 @@ resolve :: proc() { update :: proc(dt: f32) { if restart_requested { - start(theme) + start(deck, difficulty) return } - for &c in cards { card.update(&c, dt) } + for &c in active_cards() { card.update(&c, dt) } switch state { case .WAITING, .FIRST: elapsed += dt if raylib.IsMouseButtonPressed(.LEFT) { - for &c, i in cards { + for &c, i in active_cards() { if card.is_hovered(&c) && select_card(i) { break } @@ -181,20 +205,22 @@ update :: proc(dt: f32) { // Draws the game and returns the screen to show next frame draw :: proc() -> themes.Screen { - next := themes.Screen.JAPANESE_MEMORY + next := themes.Screen.MEMORY raylib.ClearBackground(theme.background) - ui.draw_title("Hiragana Memory", 24, theme.primary, 48) + info := decks.DECKS[deck] + ui.draw_title(raylib.TextFormat("%s · %s", theme.name, info.name), 24, theme.primary, 48) minutes := int(elapsed) / 60 seconds := int(elapsed) % 60 - info := raylib.TextFormat("Moves %d · Pairs %d/%d · %d:%02d", moves, matches, PAIR_COUNT, minutes, seconds) - ui.draw_text_centered(info, themes.SCREEN_WIDTH / 2, 88, 24, theme.ink) + stats := raylib.TextFormat("%s · Moves %d · Pairs %d/%d · %d:%02d", + DIFFICULTY_NAMES[difficulty], moves, matches, pair_count, minutes, seconds) + ui.draw_text_centered(stats, themes.SCREEN_WIDTH / 2, 88, 24, theme.ink) if state != .OVER && ui.button({30, 28, 120, 48}, "Back", theme.primary, font_size = 22) { - next = .JAPANESE_MENU + next = .LANGUAGE_MENU } - for &c, i in cards { + for &c, i in active_cards() { card.draw(&c, theme, can_pick(i)) } @@ -218,13 +244,14 @@ draw_win_panel :: proc() -> Maybe(themes.Screen) { raylib.DrawRectangleRounded(panel, 0.12, 16, raylib.Fade(theme.card_face, win_t)) raylib.DrawRectangleRoundedLinesEx(panel, 0.12, 16, 4, raylib.Fade(theme.primary, win_t)) + language := decks.language_of(deck) cx := panel.x + panel_w / 2 - ui.draw_text_centered("おめでとう!", cx, panel.y + 34, 56, raylib.Fade(theme.primary, win_t), bold = true) - ui.draw_text_centered("Congratulations, all pairs found!", cx, panel.y + 112, 26, raylib.Fade(theme.ink, win_t)) + ui.draw_text_centered(language.congrats, cx, panel.y + 34, 56, raylib.Fade(theme.primary, win_t), language.congrats_style) + ui.draw_text_centered("All pairs found!", cx, panel.y + 112, 26, raylib.Fade(theme.ink, win_t)) minutes := int(elapsed) / 60 seconds := int(elapsed) % 60 stats := raylib.TextFormat("%d moves · %d:%02d", moves, minutes, seconds) - ui.draw_text_centered(stats, cx, panel.y + 156, 26, raylib.Fade(theme.ink, win_t), bold = true) + ui.draw_text_centered(stats, cx, panel.y + 156, 26, raylib.Fade(theme.ink, win_t), .BOLD) if win_t < 1 { return nil } button_w: f32 = 200 @@ -233,7 +260,7 @@ draw_win_panel :: proc() -> Maybe(themes.Screen) { restart_requested = true } if ui.button({cx + 10, button_y, button_w, 60}, "Menu", theme.ink) { - return .JAPANESE_MENU + return .LANGUAGE_MENU } return nil } diff --git a/src/screens/screens.odin b/src/screens/screens.odin index 41f573a..b19d035 100644 --- a/src/screens/screens.odin +++ b/src/screens/screens.odin @@ -3,15 +3,11 @@ package screens import "core:math" import raylib "vendor:raylib" import card "../card" +import decks "../decks" +import memory "../memory" import themes "../themes" import ui "../ui" -LANGUAGES :: [3]struct{ theme: themes.Theme, screen: themes.Screen }{ - {themes.JAPAN, .JAPANESE_MENU}, - {themes.KOREA, .KOREAN_MENU}, - {themes.THAI, .THAI_MENU}, -} - // Draws a card back like a playing card lying on the table @(private) draw_card_art :: proc(flag: themes.Flag, rect: raylib.Rectangle, rotation: f32 = 0) { @@ -26,13 +22,18 @@ draw_card_art :: proc(flag: themes.Flag, rect: raylib.Rectangle, rotation: f32 = raylib.DrawTexturePro(texture, source, dest, origin, rotation, themes.WHITE) } -main_menu :: proc() -> themes.Screen { - next := themes.Screen.MAIN_MENU +@(private) +NUMBER_KEYS :: [?]raylib.KeyboardKey{.ONE, .TWO, .THREE, .FOUR, .FIVE} + +// Returns the language picked this frame, if any +main_menu :: proc() -> Maybe(decks.Language) { raylib.ClearBackground(themes.MENU_BACKGROUND) + languages := decks.LANGUAGES + keys := NUMBER_KEYS // Thin stripes along the top in each language's primary color - stripe_w: i32 = themes.SCREEN_WIDTH / 3 - for lang, i in LANGUAGES { + stripe_w: i32 = themes.SCREEN_WIDTH / len(decks.Language) + for lang, i in languages { raylib.DrawRectangle(i32(i) * stripe_w, 0, stripe_w, 8, lang.theme.primary) } @@ -46,66 +47,88 @@ main_menu :: proc() -> themes.Screen { start_x := (themes.SCREEN_WIDTH - total) / 2 // Gentle bobbing so the menu feels alive time := f32(raylib.GetTime()) - for lang, i in LANGUAGES { + picked: Maybe(decks.Language) + for lang, language in languages { + i := int(language) x := start_x + f32(i) * (tile_w + gap) bob := math.sin(time * 1.6 + f32(i) * 1.1) * 4 rotation := f32(i - 1) * 4 draw_card_art(lang.theme.flag, {x, 250 + bob, tile_w, tile_h}, rotation) - button_rect := raylib.Rectangle{x + tile_w / 2 - themes.BUTTON_WIDTH / 2 + 30, 500, themes.BUTTON_WIDTH - 60, themes.BUTTON_HEIGHT} - if ui.button(button_rect, lang.theme.name, lang.theme.primary) { - next = lang.screen + button_rect := raylib.Rectangle{x + tile_w / 2 - (themes.BUTTON_WIDTH - 60) / 2, 500, themes.BUTTON_WIDTH - 60, themes.BUTTON_HEIGHT} + if ui.button(button_rect, lang.theme.name, lang.theme.primary, hotkey = keys[i]) { + picked = language } } - ui.draw_text_centered("Esc to go back · Esc on this screen quits", themes.SCREEN_WIDTH / 2, 660, 18, raylib.Fade(themes.DARK_GRAY, 0.7)) - return next + ui.draw_text_centered("1-3 pick a language · Esc goes back, and quits from here", themes.SCREEN_WIDTH / 2, 660, 18, raylib.Fade(themes.DARK_GRAY, 0.8)) + return picked } -// Shared layout for a language's menu screen. Returns the clicked option index, -1 for back, or nil. -@(private) -language_menu :: proc(theme: themes.Theme, subtitle: cstring, options: []cstring) -> Maybe(int) { +Language_Menu_Result :: union { + decks.Deck_Id, // start a game with this deck + themes.Screen, // go to another screen +} + +// A language's menu: pick a deck and a difficulty +language_menu :: proc(language: decks.Language, difficulty: ^memory.Difficulty) -> Language_Menu_Result { + info := decks.LANGUAGES[language] + theme := info.theme + keys := NUMBER_KEYS raylib.ClearBackground(theme.background) raylib.DrawRectangle(0, 0, themes.SCREEN_WIDTH, 8, theme.primary) - ui.draw_title(theme.name, 70, theme.primary) - ui.draw_text_centered(subtitle, themes.SCREEN_WIDTH / 2, 170, themes.SUBTITLE_FONT_SIZE, theme.ink) + ui.draw_title(theme.name, 50, theme.primary) + ui.draw_text_centered(info.native, themes.SCREEN_WIDTH / 2, 140, 30, theme.ink, info.symbol_style) // A small fan of card backs for i in 0 ..< 3 { offset := f32(i - 1) - draw_card_art(theme.flag, {themes.SCREEN_WIDTH / 2 - 55 + offset * 70, 235 + abs(offset) * 10, 110, 146}, offset * 9) + draw_card_art(theme.flag, {themes.SCREEN_WIDTH / 2 - 50 + offset * 64, 195 + abs(offset) * 10, 100, 133}, offset * 9) } - result: Maybe(int) - y: f32 = 440 - for option, i in options { - if ui.button({(themes.SCREEN_WIDTH - themes.BUTTON_WIDTH) / 2, y, themes.BUTTON_WIDTH, themes.BUTTON_HEIGHT}, option, theme.primary) { - result = i + result: Language_Menu_Result + + // One button per deck + deck_list := decks.decks_for(language) + button_w: f32 = 220 + gap: f32 = 24 + total := f32(len(deck_list)) * button_w + f32(len(deck_list) - 1) * gap + x := (themes.SCREEN_WIDTH - total) / 2 + for deck, i in deck_list { + rect := raylib.Rectangle{x, 380, button_w, themes.BUTTON_HEIGHT} + if ui.button(rect, decks.DECKS[deck].name, theme.primary, hotkey = keys[i]) { + result = deck } - y += themes.BUTTON_HEIGHT + 20 + ui.draw_text_centered(decks.DECKS[deck].native, x + button_w / 2, 450, 22, theme.ink, info.symbol_style) + x += button_w + gap } - if ui.button({(themes.SCREEN_WIDTH - themes.BUTTON_WIDTH) / 2, y, themes.BUTTON_WIDTH, themes.BUTTON_HEIGHT}, "Back", theme.ink) { - result = -1 + + // Difficulty selector + names := memory.DIFFICULTY_NAMES + layouts := memory.LAYOUTS + ui.draw_text_centered("Difficulty (Left / Right)", themes.SCREEN_WIDTH / 2, 500, 20, raylib.Fade(theme.ink, 0.7)) + seg_w: f32 = 150 + seg_x := (themes.SCREEN_WIDTH - 3 * seg_w - 2 * 12) / 2 + for level in memory.Difficulty { + selected := difficulty^ == level + color := selected ? theme.primary : raylib.ColorLerp(theme.primary, themes.WHITE, 0.55) + label := raylib.TextFormat("%s %d", names[level], layouts[level].rows * layouts[level].cols / 2) + if ui.button({seg_x, 530, seg_w, 48}, label, color, font_size = 22, selected = selected) { + difficulty^ = level + } + seg_x += seg_w + 12 } + if raylib.IsKeyPressed(.LEFT) && difficulty^ > .EASY { + difficulty^ = memory.Difficulty(int(difficulty^) - 1) + } + if raylib.IsKeyPressed(.RIGHT) && difficulty^ < .HARD { + difficulty^ = memory.Difficulty(int(difficulty^) + 1) + } + + if ui.button({30, 28, 120, 48}, "Back", theme.ink, font_size = 22) { + result = themes.Screen.MAIN_MENU + } + hint := len(deck_list) > 1 ? cstring("1-2 pick a deck · Left / Right difficulty · Esc back") : cstring("1 start · Left / Right difficulty · Esc back") + ui.draw_text_centered(hint, themes.SCREEN_WIDTH / 2, 660, 18, raylib.Fade(theme.ink, 0.6)) return result } - -japanese_menu :: proc() -> themes.Screen { - choice, clicked := language_menu(themes.JAPAN, "ひらがな · Hiragana", {"Memory Game"}).? - if !clicked { return .JAPANESE_MENU } - return choice == 0 ? .JAPANESE_MEMORY : .MAIN_MENU -} - -korean_menu :: proc() -> themes.Screen { - if _, clicked := language_menu(themes.KOREA, "Hangul · coming soon", {}).?; clicked { - return .MAIN_MENU - } - return .KOREAN_MENU -} - -thai_menu :: proc() -> themes.Screen { - if _, clicked := language_menu(themes.THAI, "Thai script · coming soon", {}).?; clicked { - return .MAIN_MENU - } - return .THAI_MENU -} diff --git a/src/themes/themes.odin b/src/themes/themes.odin index 95673a7..5a005d1 100644 --- a/src/themes/themes.odin +++ b/src/themes/themes.odin @@ -7,10 +7,8 @@ SCREEN_HEIGHT :: 720 Screen :: enum { MAIN_MENU, - JAPANESE_MENU, - JAPANESE_MEMORY, - KOREAN_MENU, - THAI_MENU, + LANGUAGE_MENU, + MEMORY, } // Which national flag the card backs are modelled on @@ -88,5 +86,3 @@ CARD_WIDTH :: 96 CARD_HEIGHT :: 128 CARD_SPACING :: 14 GRID_TOP :: 136 -GRID_ROWS :: 4 -GRID_COLS :: 6 diff --git a/src/ui/ui.odin b/src/ui/ui.odin index 0d0f1cd..b84f272 100644 --- a/src/ui/ui.odin +++ b/src/ui/ui.odin @@ -5,6 +5,8 @@ import assets "../assets" import audio "../audio" import themes "../themes" +Font_Style :: assets.Font_Style + TEXT_SPACING :: 1 @(private) @@ -25,38 +27,42 @@ set_hovered :: proc() { any_hovered = true } -measure_text :: proc(text: cstring, size: f32, bold := false) -> raylib.Vector2 { - return raylib.MeasureTextEx(assets.get_font(bold), text, size, TEXT_SPACING) +measure_text :: proc(text: cstring, size: f32, style: Font_Style = .REGULAR) -> raylib.Vector2 { + return raylib.MeasureTextEx(assets.get_font(style), text, size, TEXT_SPACING) } -draw_text :: proc(text: cstring, pos: raylib.Vector2, size: f32, color: raylib.Color, bold := false) { - raylib.DrawTextEx(assets.get_font(bold), text, pos, size, TEXT_SPACING, color) +draw_text :: proc(text: cstring, pos: raylib.Vector2, size: f32, color: raylib.Color, style: Font_Style = .REGULAR) { + raylib.DrawTextEx(assets.get_font(style), text, pos, size, TEXT_SPACING, color) } // Draws text horizontally centered on center_x with its top at y -draw_text_centered :: proc(text: cstring, center_x, y, size: f32, color: raylib.Color, bold := false, shadow := false) { - w := measure_text(text, size, bold).x +draw_text_centered :: proc(text: cstring, center_x, y, size: f32, color: raylib.Color, + style: Font_Style = .REGULAR, shadow := false) { + w := measure_text(text, size, style).x pos := raylib.Vector2{center_x - w / 2, y} if shadow { - draw_text(text, pos + {0, size * 0.05}, size, raylib.Fade(themes.BLACK, 0.18), bold) + draw_text(text, pos + {0, size * 0.05}, size, raylib.Fade(themes.BLACK, 0.18), style) } - draw_text(text, pos, size, color, bold) + draw_text(text, pos, size, color, style) } // Draws text centered in a rectangle -draw_text_in_rect :: proc(text: cstring, rect: raylib.Rectangle, size: f32, color: raylib.Color, bold := false) { - dims := measure_text(text, size, bold) +draw_text_in_rect :: proc(text: cstring, rect: raylib.Rectangle, size: f32, color: raylib.Color, + style: Font_Style = .REGULAR) { + dims := measure_text(text, size, style) pos := raylib.Vector2{rect.x + (rect.width - dims.x) / 2, rect.y + (rect.height - dims.y) / 2} - draw_text(text, pos, size, color, bold) + draw_text(text, pos, size, color, style) } draw_title :: proc(text: cstring, y: f32, color: raylib.Color, size: f32 = themes.TITLE_FONT_SIZE) { - draw_text_centered(text, themes.SCREEN_WIDTH / 2, y, size, color, bold = true, shadow = true) + draw_text_centered(text, themes.SCREEN_WIDTH / 2, y, size, color, style = .BOLD, shadow = true) } -// A rounded button with hover, press and shadow states. Returns true when clicked. +// A rounded button with hover, press and shadow states. Returns true when clicked +// or when its hotkey is pressed. button :: proc(rect: raylib.Rectangle, text: cstring, color: raylib.Color, - text_color := themes.WHITE, font_size: f32 = themes.BUTTON_FONT_SIZE) -> bool { + text_color := themes.WHITE, font_size: f32 = themes.BUTTON_FONT_SIZE, + hotkey := raylib.KeyboardKey.KEY_NULL, selected := false) -> bool { hovered := raylib.CheckCollisionPointRec(raylib.GetMousePosition(), rect) pressed := hovered && raylib.IsMouseButtonDown(.LEFT) if hovered { set_hovered() } @@ -76,9 +82,14 @@ button :: proc(rect: raylib.Rectangle, text: cstring, color: raylib.Color, raylib.DrawRectangleRounded(shadow, 0.4, 12, raylib.Fade(themes.BLACK, 0.18)) body := raylib.Rectangle{rect.x, rect.y - lift, rect.width, rect.height} raylib.DrawRectangleRounded(body, 0.4, 12, fill) - draw_text_in_rect(text, body, font_size, text_color, bold = true) + if selected { + ring := raylib.Rectangle{body.x - 4, body.y - 4, body.width + 8, body.height + 8} + raylib.DrawRectangleRoundedLinesEx(ring, 0.4, 12, 3, color) + } + draw_text_in_rect(text, body, font_size, text_color, style = .BOLD) clicked := hovered && raylib.IsMouseButtonPressed(.LEFT) + if hotkey != .KEY_NULL && raylib.IsKeyPressed(hotkey) { clicked = true } if clicked { audio.play(.CLICK) } return clicked } diff --git a/tests/memory_test.odin b/tests/memory_test.odin index eb1a360..6b63575 100644 --- a/tests/memory_test.odin +++ b/tests/memory_test.odin @@ -1,6 +1,8 @@ package tests import "core:testing" +import assets "../src/assets" +import decks "../src/decks" import card "../src/card" import memory "../src/memory" import themes "../src/themes" @@ -17,7 +19,7 @@ advance :: proc(seconds: f32) { // Finds the card index holding the other half of card i's pair @(private) partner_of :: proc(i: int) -> int { - for c, j in memory.cards { + for c, j in memory.active_cards() { if j != i && c.pair_id == memory.cards[i].pair_id { return j } } return -1 @@ -26,76 +28,148 @@ partner_of :: proc(i: int) -> int { // Finds a card index that does not pair with card i @(private) non_partner_of :: proc(i: int) -> int { - for c, j in memory.cards { + for c, j in memory.active_cards() { if j != i && c.pair_id != memory.cards[i].pair_id { return j } } return -1 } @(test) -hiragana_table_is_complete_and_unique :: proc(t: ^testing.T) { - table := memory.HIRAGANA - testing.expect_value(t, len(table), 46) - for a, i in table { - for b, j in table { - if i == j { continue } - testing.expectf(t, a.kana != b.kana, "duplicate kana %s", a.kana) - testing.expectf(t, a.romaji != b.romaji, "duplicate romaji %s", a.romaji) +deck_sizes :: proc(t: ^testing.T) { + testing.expect_value(t, len(decks.entries(.HIRAGANA)), 46) + testing.expect_value(t, len(decks.entries(.KATAKANA)), 46) + testing.expect_value(t, len(decks.entries(.HANGUL)), 24) + testing.expect_value(t, len(decks.entries(.THAI_CONSONANTS)), 42) +} + +@(test) +decks_have_unique_symbols_and_readings :: proc(t: ^testing.T) { + for deck in decks.Deck_Id { + entries := decks.entries(deck) + for a, i in entries { + for b, j in entries { + if i == j { continue } + testing.expectf(t, a.symbol != b.symbol, "%v: duplicate symbol %s", deck, a.symbol) + // Readings may repeat (e.g. Thai "kh") only when the hint tells them apart + same_reading := a.reading == b.reading && a.hint == b.hint + testing.expectf(t, !same_reading, "%v: %s and %s read the same", deck, a.symbol, b.symbol) + } + } + } +} + +@(private) +covers :: proc(codepoints: []rune, text: cstring) -> (missing: rune, ok: bool) { + outer: for r in string(text) { + for c in codepoints { + if c == r { continue outer } + } + return r, false + } + return 0, true +} + +// raylib renders "?" for any glyph that wasn't baked into the font +@(test) +fonts_cover_every_deck_character :: proc(t: ^testing.T) { + for deck in decks.Deck_Id { + symbol_points := assets.codepoints_for(decks.language_of(deck).symbol_style) + defer delete(symbol_points) + ui_points := assets.codepoints_for(.BOLD) + defer delete(ui_points) + for entry in decks.entries(deck) { + if r, ok := covers(symbol_points[:], entry.symbol); !ok { + testing.expectf(t, false, "%v: %s needs %r in the symbol font", deck, entry.symbol, r) + } + if r, ok := covers(ui_points[:], entry.reading); !ok { + testing.expectf(t, false, "%v: %s needs %r in the UI font", deck, entry.reading, r) + } + if entry.hint == nil { continue } + if r, ok := covers(ui_points[:], entry.hint); !ok { + testing.expectf(t, false, "%v: %s needs %r in the UI font", deck, entry.hint, r) + } + } + info := decks.DECKS[deck] + if r, ok := covers(symbol_points[:], info.native); !ok { + testing.expectf(t, false, "%v: deck name %s needs %r", deck, info.native, r) + } + } + for language in decks.Language { + info := decks.LANGUAGES[language] + points := assets.codepoints_for(info.congrats_style) + defer delete(points) + if r, ok := covers(points[:], info.congrats); !ok { + testing.expectf(t, false, "%v: %s needs %r", language, info.congrats, r) + } + native_points := assets.codepoints_for(info.symbol_style) + defer delete(native_points) + if r, ok := covers(native_points[:], info.native); !ok { + testing.expectf(t, false, "%v: %s needs %r", language, info.native, r) } } } @(test) -deal_creates_kana_romaji_pairs :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) - testing.expect_value(t, memory.state, memory.State.WAITING) - testing.expect_value(t, memory.moves, 0) - testing.expect_value(t, memory.matches, 0) +deal_creates_symbol_reading_pairs :: proc(t: ^testing.T) { + for deck in decks.Deck_Id { + for difficulty in memory.Difficulty { + memory.deal(deck, difficulty) + layout := memory.LAYOUTS[difficulty] + testing.expect_value(t, memory.card_count, layout.rows * layout.cols) + testing.expect_value(t, memory.pair_count, memory.card_count / 2) + testing.expect_value(t, memory.state, memory.State.WAITING) + testing.expect_value(t, memory.moves, 0) + testing.expect_value(t, memory.matches, 0) - for pair in 0 ..< memory.PAIR_COUNT { - kana_count, romaji_count := 0, 0 - kana, romaji: cstring - for c in memory.cards { - if c.pair_id != pair { continue } - testing.expect(t, !c.face_up && !c.matched) - if c.is_kana { - kana_count += 1 - kana = c.text - } else { - romaji_count += 1 - romaji = c.text + for pair in 0 ..< memory.pair_count { + symbol_count, reading_count := 0, 0 + symbol, reading, hint: cstring + for c in memory.active_cards() { + if c.pair_id != pair { continue } + testing.expect(t, !c.face_up && !c.matched) + if c.is_symbol { + symbol_count += 1 + symbol = c.text + } else { + reading_count += 1 + reading = c.text + hint = c.hint + } + } + testing.expect_value(t, symbol_count, 1) + testing.expect_value(t, reading_count, 1) + + // The two halves must belong to the same deck entry + found := false + for entry in decks.entries(deck) { + if entry.symbol == symbol && entry.reading == reading && entry.hint == hint { found = true } + } + testing.expectf(t, found, "%v pair %d is %s/%s, which is not in the deck", deck, pair, symbol, reading) } } - testing.expect_value(t, kana_count, 1) - testing.expect_value(t, romaji_count, 1) - - // The two halves must belong to the same table entry - found := false - for entry in memory.HIRAGANA { - if entry.kana == kana && entry.romaji == romaji { found = true } - } - testing.expectf(t, found, "pair %d is %s/%s, which is not in the table", pair, kana, romaji) } } @(test) deal_lays_out_cards_on_screen_without_overlap :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) - for a, i in memory.cards { - testing.expect(t, a.rect.x >= 0 && a.rect.x + a.rect.width <= themes.SCREEN_WIDTH) - testing.expect(t, a.rect.y >= themes.GRID_TOP && a.rect.y + a.rect.height <= themes.SCREEN_HEIGHT) - for b, j in memory.cards { - if i == j { continue } - overlap := a.rect.x < b.rect.x + b.rect.width && b.rect.x < a.rect.x + a.rect.width && - a.rect.y < b.rect.y + b.rect.height && b.rect.y < a.rect.y + a.rect.height - testing.expectf(t, !overlap, "cards %d and %d overlap", i, j) + for difficulty in memory.Difficulty { + memory.deal(.HIRAGANA, difficulty) + for a, i in memory.active_cards() { + testing.expect(t, a.rect.x >= 0 && a.rect.x + a.rect.width <= themes.SCREEN_WIDTH) + testing.expect(t, a.rect.y >= themes.GRID_TOP && a.rect.y + a.rect.height <= themes.SCREEN_HEIGHT) + for b, j in memory.active_cards() { + if i == j { continue } + overlap := a.rect.x < b.rect.x + b.rect.width && b.rect.x < a.rect.x + a.rect.width && + a.rect.y < b.rect.y + b.rect.height && b.rect.y < a.rect.y + a.rect.height + testing.expectf(t, !overlap, "cards %d and %d overlap", i, j) + } } } } @(test) matching_pair_stays_up :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) + memory.deal(.HIRAGANA, .NORMAL) a := 0 b := partner_of(a) @@ -114,7 +188,7 @@ matching_pair_stays_up :: proc(t: ^testing.T) { @(test) mismatched_pair_flips_back :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) + memory.deal(.HIRAGANA, .NORMAL) a := 0 b := non_partner_of(a) @@ -130,7 +204,7 @@ mismatched_pair_flips_back :: proc(t: ^testing.T) { @(test) invalid_picks_are_rejected :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) + memory.deal(.HIRAGANA, .NORMAL) a := 0 testing.expect(t, memory.select_card(a)) testing.expect(t, !memory.select_card(a)) // same card twice @@ -142,7 +216,7 @@ invalid_picks_are_rejected :: proc(t: ^testing.T) { testing.expect(t, !memory.select_card(c)) // a third card while resolving testing.expect_value(t, memory.moves, 1) - memory.deal(themes.JAPAN) + memory.deal(.HIRAGANA, .NORMAL) p := partner_of(0) memory.select_card(0) memory.select_card(p) @@ -152,17 +226,17 @@ invalid_picks_are_rejected :: proc(t: ^testing.T) { @(test) finding_all_pairs_wins :: proc(t: ^testing.T) { - memory.deal(themes.JAPAN) - for i in 0 ..< memory.CARD_COUNT { + memory.deal(.HIRAGANA, .NORMAL) + for i in 0 ..< memory.card_count { if memory.cards[i].matched { continue } memory.select_card(i) memory.select_card(partner_of(i)) advance(2) } testing.expect_value(t, memory.state, memory.State.OVER) - testing.expect_value(t, memory.matches, memory.PAIR_COUNT) - testing.expect_value(t, memory.moves, memory.PAIR_COUNT) - for &c in memory.cards { testing.expect(t, c.matched) } + testing.expect_value(t, memory.matches, memory.pair_count) + testing.expect_value(t, memory.moves, memory.pair_count) + for &c in memory.active_cards() { testing.expect(t, c.matched) } // The clock stops once the game is over elapsed := memory.elapsed